3

如何使用 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);
4

3 回答 3

3

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

于 2013-09-26T14:51:36.593 回答
0

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

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

于 2013-09-26T14:52:00.720 回答
0

您可以提供一组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);
于 2013-09-26T14:53:03.213 回答