【问题标题】:Check if file exists anywhere on the system...?检查文件是否存在于系统上的任何位置...?
【发布时间】:2018-06-28 20:27:33
【问题描述】:

如果我位于文件结构深处的目录中,如何检查文件是否存在于文件树的某个位置(例如系统上的任何位置)?我正在尝试使用 exists() 文件,但它似乎不起作用。

例如:如果根目录有四个子目录:a、b、c、d。并且 dir a 有文件 a.txt。如果 dir d 有三个子目录,而我目前在最远的子目录中。如果我执行 (new File("a.txt")).exists() 之类的操作,则表示该文件不存在。因此,我想知道如何查找文件是否存在于系统上任何位置的超级目录中。

编辑:例如,如果我不知道文件所在的目录,只知道文件名,你怎么看它是否存在?

我是 Java 新手,因此我们将不胜感激。

【问题讨论】:

  • 您是否尝试过自己编写代码并查看它是否有效?一点点努力就会有很长的路要走。
  • 是的,它不起作用。我想知道如何查看超级目录中是否存在文件
  • 好吧,使用绝对路径:new File("/a/a.txt"),或相对路径:new File("../../a/a.txt")。您需要了解一般的文件路径:这不仅限于 Java。
  • 如果我不知道绝对路径,只知道文件名怎么办?
  • 好吧,在这种情况下,您必须扫描整个磁盘才能找到它。但这真的不是你想做的事情。所以改变你的设计,这样你就不必这样做了。顺便说一句,你怎么知道它是正确的 a.txt 文件:文件系统上可能有很多。

标签: java file io


【解决方案1】:

您可以将java.nio 类与Java 8 的stream 结合使用。 Files 类包含一个 walk 方法,它将遍历文件和目录。

Path root = Paths.get("/path/to/root");
boolean result = Files.walk(root)
                      .filter(Files::isRegularFile)
                      .anyMatch(p -> p.endsWith("a.txt"));

请注意,endsWith 会匹配完整的文件名,如果文件名为 bla.txt,则不会匹配。

如果您需要查找该文件,您可以执行以下操作:

Optional<Path> result = Files.walk(root)
            .filter(Files::isRegularFile)
            .filter(p -> p.endsWith("a.txt"))
            .findAny();

if (result.isPresent()) {
  // do something with the file
} else {
  // whoopsie, not found
}

如果您要查找多个文件,可以执行以下操作:

List<Path> result = Files.walk(root)
                         .filter(Files::isRegularFile)
                         .filter(p -> p.endsWith("a.txt"))
                         .collect(Collectors.toList());
if (!result.isEmpty()) {
   ... do smth with the paths
} else {
   ... whoopsie, not found
}

如果需要,您也可以直接处理找到的文件:

Files.walk(root)
     .filter(Files::isRegularFile)
     .filter(p -> p.endsWith("a.txt"))
     .forEach(this::process); 


private void process(Path path) {
   // do smth with the path
}

...

【讨论】:

  • 感谢您的回复。出于某种原因, Path root = Files.get("/");对我不起作用。你能告诉我为什么吗?
  • 我的错,它是Paths.get,将修复答案。如果您使用的是 Windows,则可能需要包含驱动器号。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2016-12-26
相关资源
最近更新 更多