Bonjour,

Pour les besoins d'une application qui toune sous GNU/Linux, j'ai écrit une classe ArgFilter qui implémente java.io.FileFilter pour filtrer des noms de fichiers de la facon la plus générale qui soit.
Je cherche à reproduire le même genre de filtre d'argument qu'offre la commande ls en linux : un filtre du genre *iMg*.nc

J'ai un petit code qui à l'air de marcher.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
//////////////////////////////////////////////
  public class ArgFilter implements java.io.FileFilter {
 
    private String filter;
    private String[] splitFilter;
    private int nbPattern;
    private boolean allFiles;
 
    //------------------------------
    public ArgFilter(String arg) {
      filter = arg;
      allFiles = filter.equals("*.*") || filter.equals("*");
      splitFilter = filter.split("\\*");
      nbPattern = splitFilter.length;
    }
 
    //-----------------------------
    public boolean accept(File f) {
 
      // Return false if directory
      if (!f.isFile()) return false;
      // Return true if "*.*"
      if (allFiles) return true;
      String n = f.getName();
      // Return false if file length smaller than filter length
      if (n.length() < filter.length()) return false;
      String pattern = splitFilter[0];
      // Process first and last patterns in case they are not "*"
      if (pattern != null && !n.startsWith(pattern)) return false;
      if (!filter.endsWith("*") && !n.endsWith(splitFilter[nbPattern - 1])) return false;
      String subn;
      // Process other patterns
      int k = (pattern != null) ? pattern.length() : 0;
      for (int i = 1; i < nbPattern; i++) {
        pattern = splitFilter[i];
        if (pattern != null) {
          subn = n.substring(k);
          if (subn.contains(pattern)) k = subn.indexOf(pattern) + pattern.length();
          else return false;
        }
      }
      // Eventually return true
      return true;
    }
  }
Que j'utilise de la façon suivante, par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
File inputPath = new File("/lib/");
File[] listFile = inputPath.listFiles(new ArgFilter("li*mca*"));
for (File file : listFile) System.out.print(file.getName() + " ");
Je le soumets simplement à vos critiques et commentaires. Est-ce la bonne façon de s'y prendre ? Comment l'améliorer ? Toutes remarques bienvenues !
Merci d'avance
Philippe.