设置文件权限总是返回FALSE

13

代码:

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上,只有第3个setWritable的调用返回false。 目标是创建文件/目录,使得用户(tomcat)和组能够读/写。但是,在Ubuntu上创建的文件并没有权限让组进行写入。

1
你以拥有该目录的用户身份运行程序了吗?在Windows下,该用户是否是管理员? - Peter Lawrey
@Peter - 是的,这个用户也创建了目录和文件。不是Win/Ubuntu管理员,而是“tomcat”用户。 - urir
@urir:尝试更改控制台的权限,检查您是否有权限。 - Bhavik Shah
@urir:你说的"user(tomcat)"是什么意思? - Bhavik Shah
1
@Bhavik: -rw-rw-r-- 1 tomcat www-data 9334 Dec 15 23:40 logo_121854_201212151159.png - urir
显示剩余3条评论
4个回答

18

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

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():

返回值:如果操作成功,则为true。如果用户没有权限更改此抽象路径名的访问权限,则操作将失败。如果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");
  }

如果我使用这个用户登录,那么在命令行中我有更改它的权限。 - urir
同样适用于创建目录和在目录中创建文件的相同调用。 - urir
尝试在Ubuntu上更改umask。 - Bhavik Shah

2
也许您没有以Linux的超级用户身份运行此程序。也有可能是您(以登录身份)本身没有权限授予文件权限。

正确的,这不是超级用户。 这是运行Tomcat的“tomcat”用户。 用户是其他X组的一部分。 在创建目录和文件时,我们希望将该文件的权限授予组X中的其他用户。 - urir

0
你需要调用createNewFile()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接