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

有效地查找特定目录中的文件

燕烨
2023-03-14

我有一个简单的问题:我使用files.walkfileTree迭代一个大的、深嵌套的目录结构,如下所示:

final int CUTOFF = 5;
final List<Path> foundList = new ArrayList<>();
Files.walkFileTree( codeRoot, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
             throws IOException {
        String rPath = codeRoot.relativize( dir ).toString();
        int level = rPath.length() - rPath.replace("/", "").length();
        if (dir.getFileName().toString().equals( "target" ) || level < CUTOFF) {
            return FileVisitResult.CONTINUE;
        }
        return FileVisitResult.SKIP_SUBTREE;
    }
    @Override
    public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) 
            throws IOException {
        if (file.getFileName().toString().endsWith( ".txt" )) {
            foundList.add( file );
        }
        return FileVisitResult.CONTINUE;
    }
} );

我的目标是添加特定目录target下的所有文件,我知道该目录最多是coderoot下的cutoff级别。

语言级别为Java8。

共有1个答案

嵇弘新
2023-03-14

提出的算法是一次查询。在本例中,您需要对所有目录进行线性时间搜索。您不能以这种方式最大限度地减少检查每个目录的需要。当然,您可以查看缓存,但如果您要考虑缓存一致性并需要高性能,您也可以考虑构建索引。无论哪种情况,我都将解决您所问的问题,即关于一次性查询的问题。

您使用的files.walkfileTree版本会遍历整个树,包括超过最大级别的所有文件和目录。您通过解析路径名来显式地排除它们,您正确地认为这种技术可能效率不高。解决方法是始终阅读文档。files.walkfileTree的第二个版本将最大深度作为显式参数。摘自关于浏览文件树的教程:

第二个walkFileTree方法使您可以额外指定访问级别数的限制和一组FileVisitOption枚举。

如果您使用第二种方法,您将只访问最大级别内的候选文件,并且您可以避免剪枝子树的所有代码

 类似资料:
  • 问题内容: 我正在尝试检查给定目录中的特定文件。我不需要代码,但我想修复已有的代码。这个问题的唯一区别是,我正在寻找带有扩展名的文件。 我已经准备好代码:- 但是由于某些原因,它不起作用。我不明白为什么,有人可以在这里找到任何错误吗? 问题答案: 您希望temp.MOD文件位于当前目录(运行应用程序的目录)中,还是希望它位于“目录”文件夹中?在后一种情况下,尝试以这种方式创建文件: 还要检查文件权

  • 问题内容: 我正在尝试获取目录中所有文本文件的名称。如果目录中包含子目录,那么我也想在这些子目录中获取任何文本文件。我不确定如何继续执行任意数量的子目录。 现在,下面的代码仅获取当前目录中的所有文本文件以及该目录中的子目录。对于找到的每个子目录,它还会找到任何文本文件和更深的子目录。问题是,如果那些更深的子目录还有更深的子目录,那么我找不到所有的文本文件。这似乎是一个需要递归的问题,因为我不知道它

  • 问题内容: 我需要递归地读取目录结构,但是一旦我读完每个目录的所有条目,还需要执行其他步骤。因此,我需要编写自己的递归逻辑(并且不能使用简单的例程)。但是,和例程仅返回切片。如果我要限制 ext4 或 xfs 的限制,并建立一个目录,文件的数量达到数十亿怎么办?我希望 golang 具有在通道而不是排序的切片上返回未排序的一系列(甚至更好的是原始字符串)的函数。在这种情况下,我们如何有效地读取文件

  • 我想复制具有特定日期的文件。我可以过滤掉日期。复制会产生问题。 错误是:FileNotFoundError:[Errno 2]没有这样的文件或目录。 回溯(最近的最后一次调用): 文件"C:/Python37/datetime_finder.py",第28行,在shutil.copyfile(文件,'K:\Userfiles\Ucar\UNZIP') 文件"C:\Python37\lib\shut

  • 假设我的系统上有一个特定的目录。 我想读取整个目录,并检查其中的文件是否有特定的扩展名。说<代码>。json为例。如果目录中有多个扩展名为< code >的文件。json列出所有这些文件及其名称。 我可以使用< code > File File = new File(my path);并连续执行< code>file.exists(),但是我如何扫描整个目录中的文件呢?这就是我困惑的地方。 任何帮

  • 问题内容: 以下代码将列出目录中的所有文件 尽管这是非常简单的代码,但可以完成工作。 我现在正在寻找一种仅列出结尾处带有.xml(或.XML)的文件的方法,该怎么办? 问题答案: 使用substr和strrpos查看扩展的简单方法