【发布时间】:2010-10-08 12:39:53
【问题描述】:
我使用 File 对象的 mkdirs() 函数在我的 java 程序(在 linux 上运行)中创建了一个文件夹。问题是该文件夹仅获得该组的读取权限。我需要它也有写权限(以便以后能够删除它的文件)。有什么办法呢?
【问题讨论】:
我使用 File 对象的 mkdirs() 函数在我的 java 程序(在 linux 上运行)中创建了一个文件夹。问题是该文件夹仅获得该组的读取权限。我需要它也有写权限(以便以后能够删除它的文件)。有什么办法呢?
【问题讨论】:
一个非常简单的解决方案是:
file.setExecutable(true, false);
file.setReadable(true, false);
file.setWritable(true, false);
在上面的代码中,file 是一个 File 对象。
当您创建文件时,将这些权限设置为文件setExecutable(true) 将允许您将该文件设置为Executable,仅供所有者使用。如果您再添加一个我在上面的代码中添加的参数file.setExecutable(true, false); 将使Executable false 仅用于所有者,这意味着它将为所有组/世界设置权限。
在 Debian 和 Windows XP 上测试并运行。
【讨论】:
if (!rootFile.canWrite()) { rootFile.setWritable(true, true); } 也会失败,在我看来,tomcat 用户无法更改对 dir/files 的权限
Java nio 可以帮助处理 posix 文件属性: https://docs.oracle.com/javase/8/docs/api/java/nio/file/attribute/PosixFileAttributeView.html
Path path = ...
Set<PosixFilePermission> perms =
EnumSet.of(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_WRITE);
Files.createFile(path, PosixFilePermissions.asFileAttribute(perms));
【讨论】:
我怀疑(除非/直到有人发布相反的答案)在 Java 的标准库中没有办法做到这一点,因为 POSIX 组权限(你习惯的 rwxrwxrwx 类型)不是跨平台的。 Java 6 将允许您设置所有者权限或全局权限,但(据我所知)不是组权限。如果您确实必须这样做,请尝试使用Runtime.exec("chmod g+w directory"),但在风格上将其包装在setGroupWritable() 之类的方法中可能是一个好主意。
【讨论】:
Runtime.getRuntime().exec("chmod g+w directory); ?
好的,这不是 java 解决方案,绝对不能移植。
既然您提到您是 linux,您可能会考虑检查“umask”设置并进行适当设置(以创建具有组写入权限的目录),然后启动您的 java 程序。
【讨论】:
在 java 6 上,有一些方法可以让您执行此操作,例如 setwriteable()。在以前的 java 版本中,您必须访问命令行才能执行 chmod 命令。
编辑:糟糕,我完全错了;我没有注意到您特别想要组权限。如果没有 Runtime.exec(),这些似乎无法设置。
@David:你是对的。
另一个想法:如果您有很多文件要更改,那么编写一个 shell 脚本并从 runtime.exec() 调用它怎么样?
【讨论】: