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.
Que j'utilise de la façon suivante, par exemple
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; } }
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 !
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() + " ");
Merci d'avance
Philippe.
Partager