2013-04-17 48 views
2

移動目錄我已經實現了它使用Java NIO的WatchService監測目錄樹修改文件和文件夾的應用程序。在Windows XP上運行時,除了通過在資源管理器中拖放將目錄移動到受監視樹中之外,所有文件系統更改都將被選中。的Java NIO 7/JPathWatch問題 - 在Windows

事件是爲了剪切和粘貼一個目錄(ctrl + x,ctrl + v),而不是拖放操作(編輯 - 請參閱下面的更新)。

我已經重新實現使用JPathWatch的解決方案,但是這起同樣的問題受到影響。

我註冊標準ENTRY_CREATEENTRY_DELETEENTRY_MODIFY和我還用好奇的,未公開com.sun.nio.file.ExtendedWatchEventModifier,以避免當應用程序被運行在Windows上的其他問題。

節省輪詢 - 我真的不想做的事 - 沒有任何人有什麼想法?

更新

問題是與一般的移動文件 - 我弄錯了CTRL + X/Ctrl + V的工作。請參閱下面的解決方案。

+3

輪詢方法請花點時間爲java輸入一個bug報告,因爲你似乎也發現了其他一些東西,這會讓java社區受益。 –

+0

你可以在新版本的windows上試試它,以確定它是否可能成爲Java或Windows中的錯誤? –

回答

0

編寫測試用例證明原始懷疑是不正確的 - 問題在於Windows下的任何文件移動操作。

根本的問題似乎是,在Windows上使用ExtendedWatchEventModifier.FILE_TREE修改循環監控,當父目錄複製所有子目錄 - 但不能移動。

當目錄被移動時ENTRY_CREATE僅在父目錄中註冊,所以我的解決方案是刪除FILE_TREE並手動遞歸監控目錄。

有一個警告,這是一個丟失/丟失的情況 - 之所以首先使用FILE_TREE是爲了允許監視遞歸刪除目錄樹。如果手動遞歸地觀察目錄,則在子目錄上放置文件鎖。這可以防止用戶首先刪除父目錄而不刪除子目錄。

使用FILE_TREE意味着僅在父文件夾獲得一個鎖,所以完整的樹可以由用戶刪除。

使用的不是Java NIO 7結果相同的行爲再JPathWatch:文件鎖並不能爲用戶遞歸刪除目錄樹。

最終,可使用的溶液是使用與Apache共享IO的監控類,基於關this example(但monitor.start()後附加的無限循環,因爲這不會阻止作爲是隱含的。