2011-06-03 62 views
22

我想要一個代碼片段來檢查一個目錄是否具有讀/寫權限,如果是,則執行一些操作,如果沒有,則執行其他操作。我想在這裏所示的例子:如何在java中檢查目錄的寫入權限?

try { 
    AccessController.checkPermission(new FilePermission("/tmp/*", "read,write")); 
System.out.println("Good"); 
    // Has permission 
} catch (SecurityException e) { 
    // Does not have permission 
System.out.println("Bad"); 
} 

的問題是例外總是觸發,所以它最終總是打印「壞」不管目錄是否具有寫權限或沒有。 (我將目錄改爲777或000來測試)。

是否有替代方案或某種方式來實現我所需要的?

回答

21

,如果你只是想檢查,如果你可以寫:

File f = new File("path"); 
if(f.canWrite()) { 
    // write access 
} else { 
    // no write access 
} 

檢查讀訪問,有canRead()

+0

f.canWrite在網絡路徑中失敗,例如: - 「\\ abc123 \ canwrite」。如果我沒有權限寫在這個目錄中,它不會返回正確的值。 – amod 2013-01-10 10:07:49

9

您應該使用單獨的目錄路徑("/tmp")查詢功能目錄的權限:

AccessController.checkPermission(new FilePermission("/tmp", "read,write")); 

隨着"/tmp/*"您查詢裏面的所有文件的權限目錄。

0

是否要檢查文件夾中文件夾文件的權限?

路徑名中的「/ *」表示一個目錄以及該目錄中包含的所有文件。

see javadoc

4

Java有自己的權限模型,圍繞使用AccessControllerPermission類。這些權限授予代碼源(加載類的位置),並且在某些/大多數情況下,這些權限與訪問所需資源所需的任何基礎權限不同。

例如,雖然您可能已經授予所有用戶讀寫/tmp目錄的權限,但這不足以讓AccessController授予您的代碼必要的權限。您還需要在使用的策略文件(由AccessController)中添加一條規則,以從/ tmp目錄讀取和寫入文件。要創建的規則將等同於以下內容:

grant codeBase "<location of the codebase>" { 
    permission java.io.FilePermission "/tmp/-", "read, write"; 
}; 
17

在Java 我不喜歡這樣寫道:

if(Files.isWritable(path)){ 
    //ok, write 
} 

Docs

+3

該文檔只提及文件。它是否適用於目錄?它在網絡路徑上工作嗎? – Zzirconium 2017-06-23 06:16:22

+0

該參數是一個「路徑」,所以它應該無關緊要它是一個文件或目錄。 – 2017-11-27 13:12:56

0

這似乎很好地工作:

assertFalse(Files.isWritable(new File("/etc/").toPath())); 
assertTrue(Files.isWritable(new File("/tmp/").toPath()));