2010-07-01 66 views
3

File.listFiles()方法列出文件夾的內容。然而,在Windows上調用方法時,它也會產生一些 - 缺少更好的短語 - 「虛擬」文件夾(如「Documents and Settings」,在最近的Windows版本中被「用戶」取代) 。File.listFiles()並區分物理文件夾與虛擬文件夾

如果你再調用listFiles()對於那些「虛」的一個文件夾,它總是返回null。這就是我的問題所在,因爲我想遞歸遍歷所有文件夾。我需要一種方法通過檢查他們的名字,以這些文件夾中篩選出最好不...

也有一些額外的文件夾,即普通用戶不會看到(如「系統卷標信息」或回收斌該驅動器的文件夾),我很樂意找到一個過濾出來的方法,而不用將名稱列入黑名單。

不幸的是,這些文件夾的行爲與真實的行爲一樣。我正在尋找的東西就像是File.isSystemFolder()-方法。

我真的很感激您的任何意見

回答

2

如果File#isHidden()回報true您可以通過測試過濾那些隱藏的系統文件夾。

我不確定「虛擬」文件夾。我認爲只有在Java 7中使用New IO 2才能區分它們。我必須首先在Vista/Win7機器上(我目前在XP上)檢查它。


更新:我在我們2K3服務器做了一個快速測試中,文件和缺省設置也爲File#isHidden()用戶不返回true。你也可以使用它。

+0

THX,我與現在 – DeX3 2010-07-02 17:26:00

0

我不認爲你會碰到一個File.isSystemFolder方法,因爲我無法想象它會很容易強加一個「系統文件夾」的定義,它足夠用於一系列操作系統上的JVM能夠正確和有用地實施。正如Balus所建議的那樣,檢查非隱藏文件夾是一個好的開始,並且可能已經足夠了(因爲它複製了他們在資源管理器shell中看到的內容)。

關於「虛擬」文件夾 - 首先,你確定它們是虛擬的嗎?是C:\Documents and Settings(或更高版本,C:\Users)不是這個文件夾的真正的規範路徑嗎?如果不是,那麼你可以通過查看是否getCanonicalPath().equals(getAbsolutePath())(只要你準備好多少誤報並用多餘的. s和.. s)就可以很容易地將這些排除在窗口之外。

如果這不起作用,那麼他們只是普通文件夾 - 你需要考慮什麼邏輯性質這些文件夾具有使其「虛擬」。或者換句話說,拿出一些謂詞,可以用File上的方法來表達,它捕獲你想要過濾的東西。根據你的英文說明,即使我現在還不確定什麼可以,哪些不適合。

+0

謝謝你的建議去,規範和絕對路徑是不幸的是一樣的,所以我要乘坐是否隱藏()方法。也許這不是一個很糟糕的選擇,因爲用戶可能首先要避免隱藏文件夾^^ – DeX3 2010-07-02 17:24:44