2

即使文件不存在(最近删除的文件),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 。

4

2 回答 2

4

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

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

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

于 2014-08-27T17:37:29.753 回答
4
于 2014-08-23T13:29:05.333 回答