【问题标题】:Setting file permissions returns FALSE always设置文件权限总是返回 FALSE
【发布时间】:2012-12-12 16:59:47
【问题描述】:

代码:

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 上创建的文件没有该组的写入权限。

【问题讨论】:

  • 你是否以 root 用户身份运行程序?
  • 您是否以拥有该目录的用户身份运行程序?用户是Windows下的管理员吗?
  • @Akhil - 不,它在 Tomcat 中运行,因此它创建为“tomcat”用户。
  • @Peter - 是的,这个用户还创建了目录和文件。不,这不是 Win/Ubuntu 管理员,这是“tomcat”用户。
  • @Bhavik: -rw-rw-r-- 1 tomcat www-data 9334 Dec 15 23:40 logo_121854_201212151159.png

标签: java file permissions io file-permissions


【解决方案1】:

你需要调用 createNewFile()

【讨论】:

    【解决方案2】:

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

    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);
    

    然后它会工作:)

    【讨论】:

      【解决方案3】:

      来自 javadocs

      setExecutable(): 返回

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

      还有,

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

      创建一个新文件

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

      【讨论】:

      • 如果我使用此用户登录,那么在命令行中我有权更改它。
      • 另外:创建目录和在目录中创建文件的调用相同。
      • 也尝试在 ubuntu 上更改 umask
      【解决方案4】:

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

      【讨论】:

      • 正确,这不是超级用户。这是运行 Tomcat 的“tomcat”用户。用户是其他 X 组的一部分。在创建目录和文件时,我们希望向 X 组中的其他用户授予该文件的权限。
      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 2013-12-25
      • 2018-09-21
      • 2013-03-26
      • 2014-01-02
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多