Возможно ли, чтобы Java FileVisitor.visitFile() вызывался для несуществующего файла?

Java.nio.file.Files.walkFileTree() Java выполняет метод 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, который включает в себя удаленный файл.

2 ответа

Да, это возможно.

Давайте предположим, что Files.walk… все методы используют DirectoryStreams для обхода файлового дерева (что, по крайней мере, в Java 1.8.0_05, на самом деле), или внутреннего эквивалента. Документация для DirectoryStream гласит:

Итератор слабо согласован. Это потокобезопасный, но не замораживает каталог во время итерации, поэтому он может (или не может) отражать обновления каталога, которые происходят после создания DirectoryStream.

Да, это возможно. В моем случае должны были быть соблюдены следующие условия для воспроизведения ошибки:

  1. Интересующий файл находится в папке, которая индексируется Windows.
  2. С типом файла связан обработчик свойств Windows.
  3. У Windows есть время, чтобы начать индексирование файла, прежде чем он будет удален.
  4. Обработчику свойств требуется много времени (несколько минут), чтобы освободить удержание файла.

Я только что обнаружил всю эту информацию, поэтому ни один из них не упоминается в первоначальном вопросе.

Другие вопросы по тегам