[英]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.