[英]Java 7 NIO / JPathWatch issue - moving directories in Windows
我實現了一個使用Java NIO的WatchService
來監視目錄樹中文件和文件夾的更改的應用程序。 在Windows XP上運行,所有文件系統的更改都將被拾取-除了通過在Explorer中拖放目錄將目錄移動到受監視的樹中之外。
拾取事件用於剪切和粘貼目錄(ctrl + x,ctrl + v),而不是拖放( 編輯 -請參見下面的更新)。
我已經使用JPathWatch重新實現了該解決方案,但是存在同樣的問題。
我正在注冊標准ENTRY_CREATE
, ENTRY_DELETE
和ENTRY_MODIFY
並且還使用未公開說明的com.sun.nio.file.ExtendedWatchEventModifier
來避免在Windows上運行應用程序時出現其他問題。
保存以進行輪詢-我真的不想這么做-有人有什么想法嗎?
更新
總體而言,問題在於移動文件-我誤認為ctrl + x / ctrl + v正常工作。 請參閱下面的解決方案以獲取解釋。
編寫測試用例表明,最初的懷疑是不正確的-問題在於Windows下的任何文件移動操作。
根本的問題似乎是在復制父目錄但不移動父目錄時,在Windows上使用ExtendedWatchEventModifier.FILE_TREE
修飾符來遞歸監視所有子目錄。
移動目錄時,僅在父目錄上注冊ENTRY_CREATE
,因此我的解決方案是刪除FILE_TREE
並手動遞歸監視目錄。
需要注意的是,這是一種失敗/失敗的情況-首先使用FILE_TREE
的原因是允許監視目錄樹的遞歸刪除。 如果手動遞歸監視目錄,則會在子目錄上放置文件鎖。 這樣可以防止用戶刪除父目錄而不先刪除子目錄。
使用FILE_TREE
意味着僅在父文件夾上獲得鎖定,因此用戶可以刪除整個樹。
使用JPathWatch代替Java 7 NIO會導致相同的行為:文件鎖定,並且用戶無法遞歸刪除目錄樹。
最終可用的解決方案是基於此示例對Apache Commons IO的監視類使用輪詢方法(但在monitor.start()
之后附加了一個無限循環,因為這不會像暗示的那樣阻塞)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.