2011-06-06 33 views
13

我跟隨Watching a Directory for Changes Java7 nio2教程遞歸監控使用代碼示例WatchDir.java的目錄的全部內容。Java7 WatchService - 訪問拒絕錯誤試圖刪除遞歸觀看的嵌套目錄(僅限Windows)

儘管在Linux和Mac上,在Windows上(在Vista和7上測試過),使用Windows資源管理器嘗試刪除嵌套的監視文件夾失敗,並顯示類似於「訪問被拒絕:您需要執行此操作的權限「當一個文件存在於其中一個嵌套目錄中時。

例如,如果我看在Windows嵌套文件夾樹:

-- Folder A 
    -- Folder A1 
     -- File F 

,並試圖刪除文件夾A,我得到的表示拒絕訪問錯誤。然而,它工作正常,如果我:

  • 刪除文件夾A1然後再刪除文件夾A
  • 刪除文件F然後再刪除文件夾A

是否有使用NIO2 WatchService遞歸觀看的方式嵌套目錄,但不能像一個程序訪問嵌套文件一樣行事?

回答

14

如果您正在Windows上觀看目錄,那麼WatchService實現具有該目錄的開放句柄(這是Windows的工作方式)。該打開的句柄不會阻止目錄被刪除,但會阻止目錄的父目錄被立即刪除。一旦刪除了監視的目錄,則句柄關閉,但可能會在句柄關閉之前嘗試刪除該目錄。當發生這種情況時,您將看到您所看到的訪問被拒絕。如果您重試,我認爲它適用於您,這是因爲在您重試時句柄會關閉。

如果您在register調用中指定ExtendedWatchEventModifier.FILE_TREE修飾符,則Windows上的Sun JRE可以使用Windows的watch子樹功能,因爲它只創建一個文件句柄,可以繞過此問題。

+0

感謝您提供有關特定於Windows的FILE_TREE修飾符的註釋。在Java 7 Bug數據庫的相關錯誤中有類似的評論(我錯過了):http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=76a42b61021a94ffffffffa049f7587fd4149?bug_id=6972833 – 2011-06-09 23:04:47

+0

另外請注意,在Eclipse ,我不得不將由rt.jar上的訪問限制引起的錯誤降低到警告。請參閱http://lkamal.blogspot.com/2008/09/eclipse-access-restriction-on-library.html – 2011-06-10 01:22:31