为什么使用PosixFilePermission设置目录权限不起作用

Wil*_*ill 1 java java.nio.file

下面是我的代码:

String DirectoryPath = "/Users/xxx/uploads/image";
Path newDirectoryPath = Paths.get(DirecotryPath);

if (!Files.exists(newDirectoryPath)) {
    Set<PosixFilePermission> permissions = PosixFilePermissions.fromString("rwxrwxrwx");
    FileAttribute<Set<PosixFilePermission>> fileAttributes = PosixFilePermissions.asFileAttribute(permissions);
    Files.createDirectories(newDirectoryPath, fileAttributes);
}
Run Code Online (Sandbox Code Playgroud)

创建目录后,目录的权限不是777。

Sub*_*mal 5

这是因为执行用户的实际umask设置。

PosixFileAttributeView

当在文件创建时设置访问权限时,权限的实际值可能会与属性对象的值不同。这样做的原因是特定于实现的。例如,在UNIX系统上,一个进程的umask影响新创建文件的权限位。如果实现支持访问权限的设置,而基础文件系统支持访问权限,则要求实际访问权限的值等于或小于提供给createFile或createDirectory方法的属性的值。换句话说,文件可能比请求的文件更安全。

Posix.java

// add the omitted import statements
public class Posix {

    public static void main(String[] args) throws IOException {
        Path newDirectoryPath = Paths.get("/tmp/image");
        Files.deleteIfExists(newDirectoryPath);
        Set<PosixFilePermission> permissions
                = PosixFilePermissions.fromString("rwxrwxrwx");
        FileAttribute<Set<PosixFilePermission>> fileAttributes
                = PosixFilePermissions.asFileAttribute(permissions);
        Files.createDirectories(newDirectoryPath, fileAttributes);
    }
}
Run Code Online (Sandbox Code Playgroud)

在shell中执行

$ cd /tmp
$ javac Posix.java

$ umask 001
$ java Posix
$ ls -ld image/

drwxrwxrw-. 2 suboptimal suboptimal 6 Jul  5 12:38 image/

$ umask 002
$ java Posix
$ ls -ld image/

drwxrwxr-x. 2 suboptimal suboptimal 6 Jul  5 12:38 image/

$ umask 004
$ java Posix
$ ls -ld image/

drwxrwx-wx. 2 suboptimal suboptimal 6 Jul  5 12:38 image/
Run Code Online (Sandbox Code Playgroud)