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