【问题标题】:Changing group of a unix file using java使用java更改unix文件的组
【发布时间】:2013-10-02 14:44:38
【问题描述】:

如何使用 java API 更改一组文件? 我知道我可以使用Files.setOwner(Java 7) 来设置文件的所有者。

如何在 Unix Os 上更改文件的组?

解决方案

UserPrincipalLookupService lookupservice = FileSystems.getDefault()
    .getUserPrincipalLookupService();
final UserPrincipal superuser = lookupservice
    .lookupPrincipalByName("superuser");
final GroupPrincipal servicesGroup = lookupservice
    .lookupPrincipalByGroupName("services");
FileVisitor<Path> visitor = new FileVisitor<Path>() {

    @Override
    public FileVisitResult postVisitDirectory(Path dir,
            IOException exc) throws IOException {
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult preVisitDirectory(Path file,
            BasicFileAttributes attrs) throws IOException {
        setOwnerAndGroupForFile(superuser, servicesGroup, file);
        File[] listFiles = file.toFile().listFiles();
        for (File file1 : listFiles) {
            Files.walkFileTree(file1.toPath(), this);
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file,
            BasicFileAttributes attrs) throws IOException {
        setOwnerAndGroupForFile(superuser, servicesGroup, file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file,
            IOException exc) throws IOException {
        outputError("Problems while accesing file " + file);
        return FileVisitResult.CONTINUE;
    }

    private void setOwnerAndGroupForFile(final UserPrincipal superuser,
            final GroupPrincipal servicesGroup, Path file)
            throws IOException {
        Files.setOwner(file, superuser);
        PosixFileAttributeView fileAttributeView = Files
            .getFileAttributeView(file, PosixFileAttributeView.class);
        fileAttributeView.setGroup(servicesGroup);
    }
};
Files.walkFileTree(Paths.get(dataDirectoryFile.toURI()), visitor);

【问题讨论】:

标签: java nio


【解决方案1】:

您应该能够在 POSIX 系统中使用PosixFileAttributeView.setGroup()

【讨论】:

  • 太棒了..!工作 感谢您的回复。
  • @MandarKulkarni 不客气。如果答案涵盖了您问题中的所有内容,请考虑接受其中一个答案。
  • 从技术上讲,我没有收到任何异常,并且调试消息确实表明代码正在遍历文件的每个目录/子目录和更改组。但是,当我在 unix 框上执行“ls -l”时,我看不到这些文件的修改组/所有者?有什么想法吗?
  • @MandarKulkarni 我现在没有东西可以测试它。在您的上下文中考虑mastersuperuser 之间的区别。它实际上应该改变组还是它之前所在的组?
  • 预计会更改组和所有者。默认情况下,所有文件都以 root 作为所有者和组。
【解决方案2】:

我会查看JCraft's JSch library (Java Secure Channel)。它为 java 提供 SSH,允许您以用户身份进行身份验证,然后向您的内心发出 chmodchown 请求!

http://www.jcraft.com/jsch/

【讨论】:

    【解决方案3】:

    您可以提供一组 PosixFilePermission 实例来模仿 chmod 命令:

      //using PosixFilePermission to set file permissions 777
        Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>();
        //add owners permission
        perms.add(PosixFilePermission.OWNER_READ);
        perms.add(PosixFilePermission.OWNER_WRITE);
        perms.add(PosixFilePermission.OWNER_EXECUTE);
        //add group permissions
        perms.add(PosixFilePermission.GROUP_READ);
        perms.add(PosixFilePermission.GROUP_WRITE);
        perms.add(PosixFilePermission.GROUP_EXECUTE);
        //add others permissions
        perms.add(PosixFilePermission.OTHERS_READ);
        perms.add(PosixFilePermission.OTHERS_WRITE);
        perms.add(PosixFilePermission.OTHERS_EXECUTE);
    
        Files.setPosixFilePermissions(Paths.get("path/to/file"), perms);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 2020-06-28
      • 1970-01-01
      • 2016-01-14
      • 2013-10-21
      • 2023-03-09
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多