设置文件权限总是返回 FALSE

Posted

技术标签:

【中文标题】设置文件权限总是返回 FALSE【英文标题】:Setting file permissions returns FALSE always 【发布时间】: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 【参考方案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 组中的其他用户授予该文件的权限。

以上是关于设置文件权限总是返回 FALSE的主要内容,如果未能解决你的问题,请参考以下文章

权限问题导致无法删除ftp文件

php fopen函数返回false

shouldShowRequestPermissionRationale 总是返回 false

Settings.System.canWrite 总是返回 false

PHP中常用操作文件的方法

C# File.Exists 返回 false,文件确实存在