在Java中创建文件时如何设置文件所有者/组

时间:2015-08-06 09:30:13

标签: java unix posix

我想设置一个(unix)所有者和一个用Java创建的文件组。我想要this

UserControl

- 这是一个如何设置权限的示例,但我找不到如何对所有者/组执行相同操作。

请注意,在创建文件之后我不想更改所有者(这已在SO [1] [2]上得到解答),但 创建文件时。

这个问题的动机是我需要确保在我设置适当的所有者和权限时,我正在创建的文件未被其他用户修改。

2 个答案:

答案 0 :(得分:2)

似乎无法设置文件创建的所有权。当您查看open() system call的文档时,它描述了如何设置文件权限,但唯一提及的是所有者:

  

如果文件不存在,则会创建该文件。文件的所有者(用户ID)设置为进程的有效用户ID。组所有权(组ID)设置为进程的有效组ID或父目录的组ID

另见this answer

我最终采用的解决方案是:

  1. 使用默认所有者创建文件但限制性权限000

    Path file = ...;
    Set<PosixFilePermission> perms = Collections.<PosixFilePermissions>emptySet();
    FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);
    Files.createFile(file, attr);
    
  2. 将所有者/组更改为目标用户

  3. 然后,目标用户将权限设置为所需内容。
  4. 这应确保其他任何用户都无法在任何时间修改文件。

答案 1 :(得分:1)

Oracle-Documentation描述了如何设置和获得posix一致性所有者。

Path path = ...
 UserPrincipalLookupService lookupService =
     provider(path).getUserPrincipalLookupService();
 UserPrincipal joe = lookupService.lookupPrincipalByName("joe");
 Files.setOwner(path, joe);

功能原型如下所示:

public static Path setOwner(Path path,
        UserPrincipal owner)
                 throws IOException

<强>参数

  • path - 用于查找文件的文件引用
  • owner - 新文件所有者

文档中确实没有提到该组:

检索文件的组所有者

File originalFile = new File("original.jpg"); // just as an example
GroupPrincipal group = Files.readAttributes(originalFile.toPath(), PosixFileAttributes.class, LinkOption.NOFOLLOW_LINKS).group();

设置文件的组所有者

File targetFile = new File("target.jpg");
Files.getFileAttributeView(targetFile.toPath(), PosixFileAttributeView.class, LinkOption.NOFOLLOW_LINKS).setGroup(group);