12

编码:

File dir = new File(path);
boolean rc1 = dir.setExecutable(true, false);
boolean rc2 = dir.setReadable(true, false);
boolean rc3 = dir.setWritable(true, false);
if (!rc1 || !rc2 || !rc3){
    logger.warn("One of the permissions set returned false: rc1="+rc1+" rc2="+rc2+" rc3="+rc3 + " [for dir '"+dir+"']");
}

在 Ubuntu 上,所有 3 个调用都返回 false。在我的 Windows 上,只有对 setWritable 的第三次调用返回 false。

目标是创建文件/目录,以便用户(tomcat)和组能够读/写。
但是在 Ubuntu 上创建的文件没有该组的写入权限。

4

4 回答 4

16

我找到了解决方案并将回答我自己的问题:
在文件或目录上设置权限时,您首先必须实际创建目录或写入文件,然后才能设置权限。
所以,我一开始做的事情是错误的:

File dir = new File(path);
boolean rc1 = dir.setExecutable(true, false);

虽然实际上需要:

File dir = new File(path);
dir.mkdirs();
boolean rc1 = dir.setExecutable(true, false);
boolean rc2 = dir.setReadable(true, false);
boolean rc3 = dir.setWritable(true, false);

或者

    File f = new File(uploadedFileLocation);
    ImageIO.write(image, "jpg", f);
    boolean rc1 = f.setExecutable(true, false);
    boolean rc2 = f.setReadable(true, false);
    boolean rc3 = f.setWritable(true, false);

然后它将起作用:)

于 2012-12-27T11:55:15.103 回答
3

来自 javadocs

setExecutable(): 返回

当且仅当操作成功时才​​为真。如果用户无权更改此抽象路径名的访问权限,则操作将失败。如果 executable 为 false 并且底层文件系统没有实现执行权限,则操作将失败。

还,

File(String pathname)通过将给定的路径名​​字符串转换为抽象路径名来 创建一个新的File 实例。它创建一个文件实例。它不会创建新文件。

创建新文件

File f;
  f=new File("myfile.txt");
  if(!f.exists()){
  f.createNewFile();
  System.out.println("New file \"myfile.txt\" has been created 
  to the current directory");
  }
于 2012-12-27T10:01:24.787 回答
2

也许您没有在 Linux 中以超级用户身份运行它。可能是您(登录为)本身无权授予文件权限。

于 2012-12-27T09:42:11.070 回答
0

您需要调用 createNewFile()

于 2020-11-06T10:55:22.260 回答