2016-08-01 99 views
0

我正在開發一個項目,其中一部分顯示JTable中某個目錄中的所有文件,包括子目錄。用戶可以雙擊子目錄以使用該新目錄的內容來更新表格。但是,我遇到了一個問題。如何檢查文件/目錄是否爲受保護的OS文件?

我的文件列表是用file.listFiles()生成的,它可以提取所有內容:隱藏文件,鎖定文件,操作系統文件,整個工具包和堆棧,我無法訪問所有文件。例如,我沒有在「C:\ Users \ user \ Cookies \」或「C:\ ProgramData \ ApplicationData \」中讀/寫的權限。沒關係,這不是關於如何獲得這些信息的問題。相反,我不希望程序顯示無法打開的目錄。但是,我無法訪問的目錄和我所做的目錄幾乎完全相同,這使得將它們過濾出來非常困難。

我發現行爲的唯一區別是,如果我調用一個鎖定的目錄上的listFiles(),它將返回null。 下面是我使用的過濾器的代碼塊:

for(File file : folder.listFiles()) 
    if(!(file.isDirectory() && file.listFiles() == null)) 
     strings.add(file.getName()); 

其中「文件夾」是我期待中的目錄和「串」是在該目錄中的文件名列表。這個想法是一個文件只有被加載到列表中,如果它是允許編輯的文件或目錄。過濾方面工作,但有一些目錄包含數百個子目錄,其中每個包含數百個以上的文件,並且由於listFiles()是O(n),這不是一個可行的解決方案(list()isn'或者更好)。

然而, file.isHidden()返回false

canWrite()/的CanRead()/ canExecute()返回true

的getPath()返回同getAbsolutePath()和getCanonicalPath()

createNewFile()對於所有內容都返回false,即使我知道的目錄都可以。另外,這是我真正想避免的解決方案,即使這種解決方案有效。

是否有一些方法或實現我只是不知道如何幫助我查看該目錄是否可訪問,而無需解析其所有內容?我運行的是Windows 7 Professional,我使用的是Eclipse Mars 4.5.2,File的所有實例都是java.io.File)。

+0

如果您想要執行準確的文件系統對象操作,請將'File'忘記並使用JSR 203。更多細節[here](http://java7fs.wikia.com/wiki/Why_File_sucks)。 – fge

+0

我是3500線。這有點晚了。不過謝謝,我一定會在下一個項目中檢查一下。 –

+0

問題是,你必須這樣做。 '文件'不能這樣做。期... – fge

回答

4

您遇到的問題是您正在處理File。據統計,在2016年,事實上,自2011年以來(當Java 7推出時),它已被JSR 203取代。

現在什麼是JSR 203?這是一個全新的API來處理任何文件系統和文件系統對象;它擴展了「文件系統」的定義,以包含您在本地計算機上找到的內容(由JDK稱爲「默認文件系統」)以及您可能使用的其他文件系統。關於如何使用它

樣頁:here

在這個API的許多優點是,它允許訪問你以前無法訪問元數據;例如,您在評論中特別提到了您想知道Windows將哪些文件視爲「系統文件」的情況。

這是你如何做到這一點:

// get the path 
final Path path = Paths.get(...); 
// get the attributes 
final DosAttributes attrs = Files.readAttributes(path, DosFileAttributes.class); 
// Is this file a "system file"? 
final boolean isSystem = attrs.isSystem(); 

現在,什麼是Paths.get()?如前所述,API允許您一次訪問多個文件系統;一個名爲FileSystems的類允許訪問JDK可見的所有文件系統(包括創建新文件系統),並且始終存在的默認文件系統由FileSystems.getDefault()給出。

A FileSystem實例還允許您使用FileSystem#getPath訪問Path

結合這一點,你那兩個是相同的:

Paths.get(a, b, ...) 
FileSystems.getDefault().getPath(a, b, ...) 

關於例外:File處理它們很差。舉兩個例子:

  • File#createNewFile將返回false,如果該文件不能被創建;
  • File#listFiles如果由於某種原因無法讀取File對象指向的目錄內容,將返回null。

JSR 203沒有這些缺點,甚至更多。讓我們採取兩種等效方法:

這些方法和其他方法在行爲上有着根本性的區別:在發生故障時,它們會拋出異常。

而且更重要的是,你能區分這是例外:

  • 如果一個FileSystemException或衍生物的錯誤是在文件系統級別(例如,「拒絕訪問」是AccessDeniedException) ;
  • 如果是IOException,那麼問題就更加根本。

這個答案不能包含每JSR 203的每個用例;這個API非常廣泛,非常完整,雖然不是沒有缺陷,但它比任何情況下都要好得多。

+0

可以肯定的是,使用Path與具有File對象「相同」,但更好? –

+0

@MeikVtune不完全;而來自'File'的元數據位於'File'本身內,使用新的API,您需要查詢API的其他部分;而'Files'工具類是它的主要入口點。在99%以上的情況下,這足夠了,請注意,但某些非常具體的用途可能需要您使用API​​的其他部分 – fge

相關問題