[英]Java WatchService does not report files when the parent directory is deleted
我有以下文件和文件夾結構:
/root/
/root/pictures/
/root/pictures/picture1.jpg
/root/pictures/picture2.jpg
我注冊了兩個 WatchService,一個用於/root/
文件夾,一個用於/root/pictures
。 對於我注冊的事件: ENTRY_CREATE
, ENTRY_DELETE
, ENTRY_MODIFY
。
當我刪除/root/pictures/
我希望得到一個ENTRY_DELETE
事件文件夾的刪除/root/pictures/
兩個ENTRY_DELETE
事件picture1.jpg
和picture2.jpg
。 事實上,我只得到/root/pictures/
的ENTRY_DELETE
事件。 當我只刪除picture1.jpg
我會按預期得到一個刪除事件。
這是正常行為嗎? 如何使用 WatchService 獲取已刪除文件夾中的文件列表?
您沒有顯示任何代碼,所以我們不知道您是如何嘗試實現它的,但是如果目錄本身被刪除,以下內容似乎可以為目錄中的文件獲取 ENTRY_DELETE 事件(請注意,它只包含一個 WatchService , 對於目錄 xxx/yyy;我沒有包含目錄 xxx 的其他 WatchService)
public class WatchServiceApp {
public static void main(String[] args) throws IOException {
WatchService watchService = FileSystems.getDefault().newWatchService();
Path dirPath = Paths.get("/home/myuser/xxx/yyy");
WatchKey watchKey = dirPath.register(
watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
while (true) {
try {
watchService.take();
} catch (InterruptedException ex) {
break;
}
List<WatchEvent<?>> watchEventList = watchKey.pollEvents();
for (WatchEvent<?> watchEvent : watchEventList) {
Path filePath = (Path) watchEvent.context();
System.out.println("Event " + watchEvent.kind() + " for " + filePath.toString());
}
boolean watchKeyValid = watchKey.reset();
if (!watchKeyValid) {
break;
}
}
}
}
假設目錄 xxx/yyy 包含三個文件。 首先我們刪除單個文件3並得到
Event ENTRY_DELETE for file3
然后我們刪除整個 yyy 目錄並得到
Event ENTRY_DELETE for file2
Event ENTRY_DELETE for file1
看起來您最終沒有刪除您的目錄。 我的意思是,如果您通過“刪除”鍵刪除 Windows 中的目錄,您將收到一個刪除文件夾 /root/pictures/ 的事件。 但是您的文件將仍然存在於垃圾桶中。 如果您將清除垃圾桶 - 您將獲得 picture1.jpg 和 picture2.jpg 的 ENTRY_DELETE 事件
來自WatchService
的文檔(重點是我的):
平台依賴
從文件系統觀察事件的實現旨在直接映射到可用的本地文件事件通知工具,或者在本地工具不可用時使用原始機制,例如輪詢。 因此,關於如何檢測事件、它們的及時性以及它們的排序是否保留的許多細節都是高度特定於實現的。 [...]
這意味着事件傳遞的大部分方式都依賴於平台。 對於您的問題,這是正常行為嗎? 答案是:取決於平台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.