繁体   English   中英

是否可以在不存在的文件上调用Java的FileVisitor.visitFile()?

[英]Is it possible for Java's FileVisitor.visitFile() to be called on a nonexistent file?

即使文件不存在(最近删除的文件),Java的java.nio.file.Files.walkFileTree()也会执行访问者的visitFile()方法。

FileUtils.forceDelete(certainFile);
Files.exists(certainFile.toPath()); // Returns false, as expected
MySimpleFileVisitor visitor = new MySimpleFileVisitor(); // Extends SimpleFileVisitor. All it does is override visitFile() so I can see that it visits the deleted file.
Files.walkFileTree(directory, visitor); // Calls visitor.visitFile on certainFile. Not expected!

这可能吗? 我使用的是Windows,该文件位于网络驱动器上。

Files.walkFileTree()调用FileTreeWalker.walk(),它调用Files.newDirectoryStream()。 我能想到的唯一解释是Files.newDirectoryStream返回包含已删除文件的DirectoryStream。

对的,这是可能的。

让我们假设Files.walk…方法都使用DirectoryStreams来遍历文件树(至少从Java 1.8.0_05开始,它们实际上是它们)或内部等价物。 DirectoryStream文档说:

迭代器非常一致。 它是线程安全的,但在迭代时不会冻结目录,因此它可能(或可能不)反映在创建DirectoryStream之后发生的目录的更新。

对的,这是可能的。 就我而言,必须满足以下条件才能重现失败:

  1. 感兴趣的文件存在于由Windows索引的文件夹中。
  2. 该文件的类型具有与之关联的Windows属性处理程序。
  3. Windows有时间在删除文件之前开始编制索引。
  4. 属性处理程序需要很长时间(几分钟)来释放它对文件的保留。

我刚刚发现了所有这些信息,这就是原始问题中没有提到它的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM