簡體   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