繁体   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