如何在java中检查目录的写权限?

时间:2011-06-03 19:32:27

标签: 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");
}

问题是异常总是被触发,因此无论目录是否具有写权限,它总是会打印“Bad”。 (我将目录chmod到777或000进行测试)。

是否有替代或某种方式来实现我的需要?

10 个答案:

答案 0 :(得分:27)

如果您只是想检查一下是否可以写:

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

用于检查读访问权限,有一个函数canRead()

答案 1 :(得分:25)

在Java 7 中,我这样做:

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

Docs

答案 2 :(得分:11)

您应该单独使用目录路径("/tmp")来查询目录的权限:

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

使用"/tmp/*",您可以查询/tmp目录中所有文件的权限。

答案 3 :(得分:6)

Java有自己的权限模型,围绕使用AccessControllerPermission类。权限被授予代码源(加载类的位置),在某些/大多数情况下,这些权限与访问所需资源所需的任何基础权限不同。

例如,虽然您可能已授予所有用户读取和写入/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)

是否要检查文件夹文件夹中的文件的权限?

路径名中的

“/ *”表示目录以及该目录中包含的所有文件。

see javadoc

答案 6 :(得分:0)

java.io.File有两种方法canReadcanWrite就足够了。

答案 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;
  }