Java';是否要对不存在的文件调用s FileVisitor.visitFile()?

Java';是否要对不存在的文件调用s FileVisitor.visitFile()?,java,filesystems,nio,fileutils,Java,Filesystems,Nio,Fileutils,Java的Java.nio.file.Files.walkFileTree()执行访问者的visitFile()方法,即使文件不存在(最近删除的文件) 这可能吗?我正在使用Windows,文件位于网络驱动器上 Files.walkFileTree()调用FileTreeWalker.walk(),后者调用Files.newDirectoryStream()。我能想到的唯一解释是Files.newDirectoryStream返回一个包含已删除文件的DirectoryStream。是的,这是可能的

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

这可能吗?我正在使用Windows,文件位于网络驱动器上

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

是的,这是可能的

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!
让我们假设
Files.walk…
方法都使用DirectoryStreams来遍历文件树(至少在Java 1.8.0_05中,它们实际上是这样做的)或内部等效方法。报告说:

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


是的,这是可能的。在我的情况下,必须满足以下条件才能重现故障:

  • 感兴趣的文件存在于已删除的文件夹中
  • 该文件的类型具有与其关联的
  • 在删除文件之前,Windows有时间开始索引该文件
  • 属性处理程序需要很长时间(几分钟)才能释放其对文件的保留

  • 我刚刚发现了所有这些信息,这就是为什么在原始问题中没有提到这些信息。

    可能与网络(SMB?)文件系统的缓存(目录信息)有关。。我怀疑它是底层子系统本身的一部分(例如,即使Windows资源管理器被“延迟”)而不是Java。你能显示完整的代码吗?@afzalex:不幸的是,我不能显示更多的代码,尽管我知道这限制了人们帮助我。我也看到了该文档,但不确定它如何应用于这种特定行为。听到这样的行为是可能的是很有帮助的。我将此作为公认的答案删除,因为它解释了迭代器弱一致性的原因,但它没有解释为什么在创建DirectoryStream时,它已经认为某个文件存在。您确定DirectoryStream是在删除文件后创建的吗?“最近删除”是指我在代码示例中拥有的内容,即最近删除的内容。我删除文件,检查是否已删除,然后立即调用Files.walkFileTree,它调用newDirectoryStream。我假设(1)Files.exists()当且仅当文件被真正删除时返回false,(2)Files.newDirectoryStream创建一个新的DirectoryStream,而不依赖缓存的DirectoryStream。根据这些假设,我推断DirectoryStream必须在文件删除后创建。如果使用或替换
    FileUtils.forceDelete
    ,会得到不同的结果吗?