我想要一个代码片段,用于检查目录是否具有读/写权限,如果有,则执行某些操作,如果不执行则执行其他操作。我尝试了这里显示的一个例子:
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");
}
问题是异常总是被触发,因此无论目录是否具有写权限,它总是会打印“Bad”。 (我将目录chmod到777或000进行测试)。
是否有替代或某种方式来实现我的需要?
答案 0 :(得分:27)
如果您只是想检查一下是否可以写:
File f = new File("path");
if(f.canWrite()) {
// write access
} else {
// no write access
}
用于检查读访问权限,有一个函数canRead()
答案 1 :(得分:25)
答案 2 :(得分:11)
您应该单独使用目录路径("/tmp"
)来查询目录的权限:
AccessController.checkPermission(new FilePermission("/tmp", "read,write"));
使用"/tmp/*"
,您可以查询/tmp
目录中所有文件的权限。
答案 3 :(得分:6)
Java有自己的权限模型,围绕使用AccessController
和Permission
类。权限被授予代码源(加载类的位置),在某些/大多数情况下,这些权限与访问所需资源所需的任何基础权限不同。
例如,虽然您可能已授予所有用户读取和写入/tmp
目录的权限,但这对于AccessController授予您的代码必要权限是不够的。您还需要在使用的策略文件中添加规则(由AccessController)以从/ tmp目录中读取和写入文件。要创建的规则将等同于以下内容:
grant codeBase "<location of the codebase>" {
permission java.io.FilePermission "/tmp/-", "read, write";
};
答案 4 :(得分:2)
这似乎工作正常:
assertFalse(Files.isWritable(new File("/etc/").toPath()));
assertTrue(Files.isWritable(new File("/tmp/").toPath()));
答案 5 :(得分:0)
答案 6 :(得分:0)
答案 7 :(得分:0)
if(DocumentFile.fromFile(file).canWrite()){
//allowed
...
}else{
...
}
答案 8 :(得分:0)
在 Windows 上,File.canWrite() 并不总是提供准确的结果。我建议使用以下内容:
import java.nio.file.Files;
import java.nio.file.Paths;
...
if(Files.isWritable(Paths.get("path"))){
//ok, write
}
答案 9 :(得分:0)
糟糕,还有一件事。该目录还必须是可执行的,至少在 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;
}