Directement depuis this Java Tutoriel Oracle:
Deux astérisques, **, fonctionnent comme * mais franchissent les limites des répertoires. Cette syntaxe est généralement utilisée pour faire correspondre les chemins complets.
Quelqu'un pourrait-il en faire un vrai exemple? Que signifient-ils avec "traverse la limite du répertoire"? En franchissant la limite du répertoire, j'imagine quelque chose comme vérifier le fichier de la racine à getNameCount()-1
. Encore une fois, un exemple réel expliquant la différence entre * et ** dans la pratique serait formidable.
Le javadoc pour FileSystem#getPathMatcher()
a de très bons exemples et explications
*.Java Matches a path that represents a file name ending in .Java
*.* Matches file names containing a dot
*.{Java,class} Matches file names ending with .Java or .class
foo.? Matches file names starting with foo. and a single character extension
/home/*/* Matches /home/gus/data on UNIX platforms
/home/** Matches /home/gus and /home/gus/data on UNIX platforms
C:\\* Matches C:\foo and C:\bar on the Windows platform (note that the backslash is escaped; as a string literal in the Java Language the pattern would be "C:\\\\*")
Alors /home/**
correspondrait à /home/gus/data
, mais /home/*
non.
/home/*
dit chaque fichier directement dans le /home
répertoire.
/home/**
dit que chaque fichier dans n'importe quel répertoire à l'intérieur /home
.
Exemple de *
contre **
. En supposant que votre répertoire de travail actuel est /Users/username/workspace/myproject
, alors ce qui suit ne correspondra qu'à ./myproject
fichier (répertoire).
PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:/Users/username/workspace/*");
Files.walk(Paths.get(".")).forEach((path) -> {
path = path.toAbsolutePath().normalize();
System.out.print("Path: " + path + " ");
if (pathMatcher.matches(path)) {
System.out.print("matched");
}
System.out.println();
});
Si tu utilises **
, il correspondra à tous les dossiers et fichiers de ce répertoire.