簡體   English   中英

Java 7 NIO / JPathWatch問題-在Windows中移動目錄

[英]Java 7 NIO / JPathWatch issue - moving directories in Windows

我實現了一個使用Java NIO的WatchService來監視目錄樹中文件和文件夾的更改的應用程序。 在Windows XP上運行,所有文件系統的更改都將被拾取-除了通過在Explorer中拖放目錄將目錄移動到受監視的樹中之外。

拾取事件用於剪切和粘貼目錄(ctrl + x,ctrl + v),而不是拖放( 編輯 -請參見下面的更新)。

我已經使用JPathWatch重新實現了該解決方案,但是存在同樣的問題。

我正在注冊標准ENTRY_CREATEENTRY_DELETEENTRY_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM