我想遍历具有许多子目录的目录树。我的目标是打印除subdir和anotherdir子目录内的文件以外的所有.txt文件。 我可以使用以下代码实现这一点。
public static void main(String[] args) throws IOException {
Path path = Paths.get("C:\\Users\\bhapanda\\Documents\\target");
Files.walkFileTree(path, new Search());
}
private static final class Search extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\subdir");
PathMatcher pm1 = FileSystems.getDefault().getPathMatcher("glob:**\\anotherdir");
if (pm.matches(dir) || pm1.matches(dir)) {
System.out.println("matching dir found. skipping it");
return FileVisitResult.SKIP_SUBTREE;
} else {
return FileVisitResult.CONTINUE;
}
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:*.txt");
if (pm.matches(file.getFileName())) {
System.out.println(file);
}
return FileVisitResult.CONTINUE;
}
}
但是当我尝试使用以下代码编译pm和pm1 PathMatchers时,它不起作用。
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\{subdir,anotherdir}");
if (pm.matches(dir)) {
System.out.println("matching dir found. skipping it");
return FileVisitResult.SKIP_SUBTREE;
} else {
return FileVisitResult.CONTINUE;
}
}
glob语法有什么问题吗?
答案 0 :(得分:1)
是的,全局语法有问题。您需要将每个反斜杠加倍,以便它们在您的glob模式中保持转义的反斜杠。
第一个匹配者:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\subdir");
与以\subdir
结尾的路径不匹配。而是,双斜杠在glob模式中变成一个单斜杠,这意味着's'正在转义。而且,由于转义的“ s”只是一个“ s”,因此该匹配器等效于:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**subdir");
,这意味着它将匹配以subdir
结尾的任何路径。因此,它将与路径xxx\subdir
相匹配,但也将与路径xxx\xxxsubdir
和xxxsubdir
相匹配。
组合匹配器:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\{subdir,anotherdir}");
有同样的问题。在这种情况下转义的是'{'。在全局模式中,这意味着将'{'视为文字字符,而不是模式组的开头。因此,此匹配器将不匹配路径xxx\subdir
,但将匹配路径xxx{subdir,anotherdir}
。
这两个匹配器将完成预期的工作:
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\\\subdir");
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\\\{subdir,anotherdir}");