[英]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()
您應該單獨使用目錄的路徑( "/tmp"
)來查詢目錄的權限:
AccessController.checkPermission(new FilePermission("/tmp", "read,write"));
使用"/tmp/*"
可以查詢/tmp
目錄中所有文件的權限。
Java 有自己的權限 model 圍繞使用AccessController
和Permission
類。 權限被授予代碼源(加載類的位置),並且在某些/大多數情況下,這些權限不同於訪問所需資源所需的任何底層權限。
例如,盡管您可能已授予所有用戶對/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()));
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.