【问题标题】:Create directory with write permissions for the group为组创建具有写入权限的目录
【发布时间】:2010-10-08 12:39:53
【问题描述】:

我使用 File 对象的 mkdirs() 函数在我的 java 程序(在 linux 上运行)中创建了一个文件夹。问题是该文件夹仅获得该组的读取权限。我需要它也有写权限(以便以后能够删除它的文件)。有什么办法呢?

【问题讨论】:

    标签: java linux


    【解决方案1】:

    一个非常简单的解决方案是:

    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 上测试并运行。

    【讨论】:

    • 更好的解决方案是使用 java nio,因为此解决方案仅为所有者或所有人设置权限。
    • 这对我不起作用。我尝试使用 java 应用程序(用户是 tomcat)在根文件夹(在 linux 上)下创建 dir,但即使我使用 if (!rootFile.canWrite()) { rootFile.setWritable(true, true); } 也会失败,在我看来,tomcat 用户无法更改对 dir/files 的权限
    • 问题是关于授予组权限,而不是所有权限!
    【解决方案2】:

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

    【讨论】:

    • PosixFilePermission 仅适用于便携式操作系统。 PosixFilePermission 不适用于 Windows 系统
    【解决方案3】:

    我怀疑(除非/直到有人发布相反的答案)在 Java 的标准库中没有办法做到这一点,因为 POSIX 组权限(你习惯的 rwxrwxrwx 类型)不是跨平台的。 Java 6 将允许您设置所有者权限或全局权限,但(据我所知)不是组权限。如果您确实必须这样做,请尝试使用Runtime.exec("chmod g+w directory"),但在风格上将其包装在setGroupWritable() 之类的方法中可能是一个好主意。

    【讨论】:

    • 这不是很好,但确实有效。仅用于复制/粘贴:它必须是 Runtime.getRuntime.exec("chmod g+w directory")
    • @schoenk - Runtime.getRuntime().exec("chmod g+w directory); ?
    【解决方案4】:

    好的,这不是 java 解决方案,绝对不能移植。

    既然您提到您是 linux,您可能会考虑检查“umask”设置并进行适当设置(以创建具有组写入权限的目录),然后启动您的 java 程序。

    【讨论】:

      【解决方案5】:

      在 java 6 上,有一些方法可以让您执行此操作,例如 setwriteable()。在以前的 java 版本中,您必须访问命令行才能执行 chmod 命令。

      Java 6 SE File Class Doc.

      编辑:糟糕,我完全错了;我没有注意到您特别想要组权限。如果没有 Runtime.exec(),这些似乎无法设置。

      @David:你是对的。

      另一个想法:如果您有很多文件要更改,那么编写一个 shell 脚本并从 runtime.exec() 调用它怎么样?

      【讨论】:

        猜你喜欢
        • 2017-08-20
        • 2022-01-05
        • 2018-11-20
        • 2015-06-13
        • 1970-01-01
        • 2010-11-17
        • 2012-01-17
        • 2012-06-13
        • 2016-04-15
        相关资源
        最近更新 更多