Cela devrait être très simple. Si j'ai une chaîne comme celle-ci:
../Test?/sample*.txt
alors quelle est la manière généralement acceptée d'obtenir une liste de fichiers qui correspondent à ce modèle? (par exemple, il doit correspondre ../Test1/sample22b.txt
et ../Test4/sample-spiffy.txt
mais pas ../Test3/sample2.blah
ou ../Test44/sample2.txt
)
J'ai jeté un coup d'œil org.apache.commons.io.filefilter.WildcardFileFilter
et cela semble être la bonne bête, mais je ne sais pas comment l'utiliser pour rechercher des fichiers dans un chemin de répertoire relatif.
Je suppose que je peux chercher la source de fourmi car elle utilise une syntaxe générique, mais je dois manquer quelque chose d'assez évident ici.
( modifier : l'exemple ci-dessus n'était qu'un exemple de cas. Je cherche le moyen d'analyser les chemins généraux contenant des caractères génériques au moment de l'exécution. J'ai trouvé comment le faire en me basant sur la suggestion de mmyers mais c'est assez ennuyeux. Sans parler de cela le JRE java semble analyser automatiquement de simples jokers dans les arguments principaux (String []) à partir d'un seul argument pour me "gagner" du temps et des tracas ... Je suis juste content de ne pas avoir d'arguments non-fichier dans le mélanger.)
Réponses:
Considérez DirectoryScanner d'Apache Ant:
Vous devrez référencer ant.jar (~ 1,3 Mo pour ant 1.7.1).
la source
DirectoryScanner
dans plexus-utils (241Kb). Ce qui est plus petit alorsant.jar
(1,9 Mo).ls
avec le même modèle de fichier (millisecondes en utilisantls <pattern>
vs minutes en utilisant le DirectoryScanner) ...Essayez
FileUtils
depuis Apache commons-io (listFiles
etiterateFiles
méthodes):Pour résoudre votre problème avec les
TestX
dossiers, je commencerais par parcourir la liste des dossiers:Une solution de «force brute» mais devrait fonctionner correctement. Si cela ne répond pas à vos besoins, vous pouvez toujours utiliser le RegexFileFilter .
la source
Voici des exemples de liste de fichiers par modèle alimenté par Java 7 nio globbing et Java 8 lambdas:
ou
la source
Files.walk(Paths.get("..")).filter(matcher::matches).forEach(System.out::println);
Vous pouvez convertir votre chaîne générique en une expression régulière et l'utiliser avec la
matches
méthode String . En suivant votre exemple:Cela fonctionne pour vos exemples:
Et contre-exemples:
la source
?
public static boolean isFileMatchTargetFilePattern (final File f, final String targetPattern) {`` String regex = targetPattern.replace (".", "\\."); `regex = regex.replace("?", ".?").replace("
*", ".
*");
return f.getName().matches(regex);
}
StringBuffer regexBuffer = ...; Matcher matcher = Pattern.compile("(.*?)([*?])").matcher(original); while (matcher.find()) { matcher.appendReplacement(regexBuffer, (Pattern.quote(matcher.group(1)) + (matcher.group(2).equals("*") ? ".*?" : ".?")).replace("\\", "\\\\").replace("$", "\\$")); } matcher.appendTail(regexBuffer);
.
au lieu de.?
.Depuis Java 8, vous pouvez utiliser la
Files#find
méthode directement à partir dejava.nio.file
.Exemple d'utilisation
la source
Cela ne vous aidera peut-être pas pour le moment, mais JDK 7 est destiné à faire correspondre les noms de fichiers glob et regex dans le cadre de "Plus de fonctionnalités NIO".
la source
La bibliothèque de caractères génériques effectue efficacement la correspondance des noms de fichiers glob et regex:
http://code.google.com/p/wildcard/
L'implémentation est succincte - JAR ne fait que 12,9 kilo-octets.
la source
Un moyen simple sans utiliser d'importation externe est d'utiliser cette méthode
J'ai créé des fichiers csv nommés avec billing_201208.csv, billing_201209.csv, billing_201210.csv et cela semble fonctionner correctement.
La sortie sera la suivante si les fichiers répertoriés ci-dessus existent
la source
Comme indiqué dans une autre réponse, la bibliothèque de caractères génériques fonctionne à la fois pour la correspondance des noms de fichiers glob et regex: http://code.google.com/p/wildcard/
J'ai utilisé le code suivant pour faire correspondre les modèles globaux, y compris absolus et relatifs sur les systèmes de fichiers de style * nix:
J'ai passé du temps à essayer d'obtenir les méthodes FileUtils.listFiles dans la bibliothèque Apache commons io (voir la réponse de Vladimir) pour le faire, mais je n'ai pas réussi (je me rends compte maintenant / je pense qu'il ne peut gérer que le modèle correspondant à un répertoire ou un fichier à la fois) .
De plus, l'utilisation de filtres regex (voir la réponse de Fabian) pour traiter des modèles de glob de type absolu arbitraires fournis par l'utilisateur sans rechercher dans tout le système de fichiers nécessiterait un prétraitement du glob fourni pour déterminer le plus grand préfixe non-regex / glob.
Bien sûr, Java 7 peut bien gérer les fonctionnalités demandées, mais malheureusement, je suis bloqué avec Java 6 pour le moment. La bibliothèque est relativement minuscule avec une taille de 13,5 Ko.
Note aux réviseurs: j'ai tenté d'ajouter ce qui précède à la réponse existante mentionnant cette bibliothèque mais la modification a été rejetée. Je n'ai pas assez de représentants pour ajouter cela en commentaire non plus. N'y a-t-il pas une meilleure façon ...
la source
Vous devriez pouvoir utiliser le
WildcardFileFilter
. Utilisez simplementSystem.getProperty("user.dir")
pour obtenir le répertoire de travail. Essaye ça:Vous ne devriez pas avoir besoin de remplacer
*
par[.*]
, en supposant que les filtres génériques soient utilisésjava.regex.Pattern
. Je n'ai pas testé cela, mais j'utilise constamment des modèles et des filtres de fichiers.la source
Glob of Java7: recherche de fichiers . ( Échantillon )
la source
Le filtre Apache est conçu pour itérer des fichiers dans un répertoire connu. Pour autoriser également les caractères génériques dans le répertoire, vous devrez diviser le chemin sur «
\
» ou «/
» et effectuer un filtre sur chaque partie séparément.la source
Pourquoi ne pas utiliser quelque chose comme:
Ensuite, vous n'aurez pas à vous soucier des chemins relatifs et pourrez effectuer votre joker si nécessaire.
la source
Implémentez l'interface JDK FileVisitor. Voici un exemple http://wilddiary.com/list-files-matching-a-naming-pattern-java/
la source
Méthode Util:
Test jUnit:
Production:
la source
foo/bar.txt
correspondfoo?bar.txt
et ce n'est pas correct../Test?/sample*.txt
la source