2011-11-25 96 views
3

對於那些不熟悉JNotify的人來說,這是一個提供監控目錄中事件的簡單方法的庫。使用JNotify庫,如何判斷刪除的文件是文件還是目錄?

例如,當一個文件所選文件夾中被刪除,方法「fileDeleted」被調用,有幾個參數一起。這裏的fileDeleted方法的一個例子:

public void fileDeleted(int wd, String rootPath, String name) { 
    print("deleted " + rootPath + " : " + name); 
} 

現在,我想知道,如果被刪除的文件是一個文件或目錄。我通常的做法是用給定路徑創建一個新的File對象,然後使用方法isFile()和isDirectory()

但是,由於該文件已被刪除,因此這些方法總是返回false。

因此,這裏是我的具體問題:我的路徑,已刪除的文件或目錄,我怎麼能告訴羯羊它是一個文件或目錄?有沒有解決這個問題的方法?這裏最好的做法是什麼?

預先感謝您。

回答

3

我建議使用一個更好的API對於這一點,像Commons IO。它在界面org.apache.commons.io.monitor.FileAlterationListener及其方法onFile...(),onDirectory...()中具有此區別。或者,這可能是最好的方法,請使用Java 7,WatchService附帶的新標準功能,如討論的here

+0

謝謝,我仔細研究過它,但顯然WatchService不支持RENAMED通知。雖然有一個第三方庫爲它增加了這個功能,但是我發現WatchService和我使用JNotify(多個通知等)時一樣的問題。 最後,我決定使用我的服務器瞭解有關已刪除文件的知識,因爲沒有簡單的客戶端解決方案。不管怎麼說,還是要謝謝你! :) – Moeri

2

您正在查看的目錄結構有多大?

我的第一直覺是建立目錄結構的內部表示,使用一些簡單的圖形遍歷算法,然後做一個查找每一次的東西被刪除弄清楚它是什麼。

<edit>
如果你知道你的目錄結構是一個嚴格的樹,你可以用一個簡單的遞歸遍歷文件系統,並創建地圖File S或String s到boolean,所以你可以做一個簡單的查找。然後,一旦建立了地圖,使用JNotify事件應該很容易維護。
<edit/>

即使是中型目錄我也認爲這可以做得很快。這個是來做什麼的?可能還有另外一種實現相同目標的方式嗎?

+0

取決於在目錄之類的東西,你可能只需要一個簡單的遞歸算法(即,如果沒有快捷方式,使該目錄不是樹),並且您的文件/目錄可以存儲在地圖中,而不是構建圖形,將位置映射到布爾isDirectory。 爲什麼你不想問服務器?如果服務器無論如何都在跟蹤這些文件,它不能只看它自己的狀態嗎? – Dogmatixed

+0

嗨,只是爲了給你一個更新:我已經決定從客戶端解決這個問題的方法會太複雜,所以我現在正在查看服務器端,如果我正在處理文件或一個目錄,因爲客戶端不需要知道這一點。 我不會將您的答案標記爲已接受,因爲我不想讓那些偶然發現此線索的人感到困惑,顯然我無法讚揚您,因爲我沒有足夠的聲望......所以我會只是說謝謝,而不是你的時間! :) – Moeri

+0

沒問題,我其實認爲Robert Petermeier的答案可能更好。希望項目進展順利! – Dogmatixed

0

我面臨同樣的問題。但據我瞭解,Java的WatchService不允許監視子目錄,所以我不能使用它(任務是監視包含〜40K文件夾的結構的更改)。我將嘗試繼續使用簡單(和易錯)啓發式

如果它包含一個點('。'),它是一個文件。

我會發布更新,如果我遇到一些更復雜......

相關問題