设置文件权限总是返回 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的主要内容,如果未能解决你的问题,请参考以下文章
shouldShowRequestPermissionRationale 总是返回 false