簡體   English   中英

如何檢查 java 中目錄的寫權限?

[英]How to check write permissions of a directory in 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 進行測試)。

有沒有替代方法或某種方法來完成我需要的?

如果您只想檢查是否可以編寫:

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

檢查讀訪問,有一個 function canRead()

在 Java 7我這樣做:

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

文檔

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

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

使用"/tmp/*"可以查詢/tmp目錄中所有文件的權限。

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

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

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

這似乎工作正常:

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

您要檢查文件夾文件夾中文件的權限嗎?

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

見 javadoc

java.io.File有兩個方法canReadcanWrite就足夠了。

if(DocumentFile.fromFile(file).canWrite()){
   //allowed
   ...
}else{
   ...
}

在 Windows 上,File.canWrite() 並不總是提供准確的結果。 我建議使用以下內容:

import java.nio.file.Files;
import java.nio.file.Paths;
...

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

哎呀,還有一件事。 該目錄也必須是可執行的,至少在 linux 上:

  /** Make sure output dir exists and is writeable. */
  public boolean validateOutputDir(Path publishDirectory, Formatter error) {
    if (!Files.exists(publishDirectory)) {
      error.format(" Output directory '%s' does not exist%n", publishDirectory);
      return false;
    }
    if (!Files.isDirectory(publishDirectory)) {
      error.format(" Output directory '%s' is not a directory%n", publishDirectory);
      return false;
    }
    if (!Files.isWritable(publishDirectory)) {
      error.format(" Output directory '%s' is not writeable%n", publishDirectory);
      return false;
    }
    if (!Files.isExecutable(publishDirectory)) {
      error.format(" Output directory '%s' is not executable%n", publishDirectory);
      return false;
    }
    return true;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM