当前位置: 首页 > 知识库问答 >
问题:

SimpleFileVisitor遍历目录树,查找除两个子目录外的所有.txt文件

闾丘树
2023-03-14
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路径匹配器时,它是不起作用的。

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语法有什么问题吗?

共有1个答案

法和硕
2023-03-14

是的,glob语法有问题。您需要将每个反斜杠加倍,以便它们在glob模式中保持转义反斜杠。

第一个匹配者:

PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\subdir");

与以\subdir结尾的路径不匹配。相反,在glob模式中,双斜杠变成了单斜杠,这意味着“s”被转义。并且由于转义的's'只是一个's',因此该匹配器相当于:

PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**subdir");

这意味着它将匹配以subdir结尾的任何路径。因此它将匹配路径xxx\subdir,但也将匹配路径xxx\xxxsubdirxxxsubdir

组合匹配器:

PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\{subdir,anotherdir}");

也有同样的问题。在本例中转义的是“{”。在glob模式中,这意味着将“{”视为文字字符,而不是模式组的开头。因此,此匹配器将不匹配路径xxx\subdir,但将匹配路径xxx{subdir,anotherdir}

PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\\\subdir");
PathMatcher pm = FileSystems.getDefault().getPathMatcher("glob:**\\\\{subdir,anotherdir}");
 类似资料:
  • 本文向大家介绍python 遍历目录(包括子目录)下所有文件的实例,包括了python 遍历目录(包括子目录)下所有文件的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇python 遍历目录(包括子目录)下所有文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我需要在网络驱动器上遍历一个目录,并在层次结构中创建子级到父级的映射。一个代表目录是6个Terrabytes,有90万个文件和900个文件夹。我只关心文件夹而不是文件。出于测试目的,我将没有文件的文件夹复制到另一个网络驱动器,并在复制的版本上运行代码。仅仅是在900个文件夹上迭代可能需要10秒。但是,迭代原始目录结构需要30分钟。我们似乎正在遍历所有90万个文件,尽管我们只是忽略它们。 有没有一种

  • X1.4.0新增 sp_scan_dir($pattern,$flags) 功能: 替代scan_dir的方法 参数: $pattern:检索模式 搜索模式 .txt,.doc; (同glog方法) $flags:返回模式 同glog方法 返回: 类型数组 使用方法: //扫描application目录 $files=sp_scan_dir('application/*');//返回applic

  • 问题内容: 如何使用pathlib递归遍历给定目录的所有子目录? 似乎只迭代给定目录的直接子级。 我知道这可以通过或使用,但是我想使用pathlib,因为我喜欢使用path对象。 问题答案: 您可以使用对象的方法:

  • 本文向大家介绍C#遍历文件夹及子目录下所有图片,包括了C#遍历文件夹及子目录下所有图片的使用技巧和注意事项,需要的朋友参考一下 要求:取指定目录下面的所有图片,以表格的型式展示并显示该图片的相对路径。 服务端代码: 前端代码: 效果图如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我有一个根目录目录,其中包含多个子目录,所有子目录均包含文件名data.txt。我想做的是编写一个脚本,该脚本进入“根”目录,然后读取所有子目录并读取子目录中的每个“ data.txt”,然后将每个data.txt文件中的内容写入输出文件。 这是我的代码片段: 我的dosomething()部分-如果仅针对一个文件运行该部分,我已经测试并确认它可以正常工作。我还确认,如果我告诉它打印文