2013-09-26 4 views
3

Как вы можете изменить группу файла с помощью java API? Я знаю, что я могу использовать Files.setOwner (Java 7), чтобы установить владельца файла.Изменение группы unix-файла с использованием java

Как я могу изменить группу для файла в 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); 
+2

Возможный дубликат http://stackoverflow.com/questions/13241967/change-file-owner-group -under-linux-with-java-nio-files – StockB

+0

Почему: 'File [] listFiles = file.toFile(). listFiles(); for (File file1: listFiles) {Files.walkFileTree (file1.toPath(), this); } '??? –

+0

Возможный дубликат [Можно ли установить «группу» файла?] (Http://stackoverflow.com/questions/18686099/is-it-possible-to-set-the-group-of-a- файл) – Raedwald

ответ

3

Вы должны быть в состоянии использовать PosixFileAttributeView.setGroup() с системами POSIX.

+0

Brilliant ..! Работы Спасибо за ответ. –

+0

@MandarKulkarni Добро пожаловать. Подумайте о принятии одного из ответов, если они охватывают все в вашем вопросе. –

+0

Технически я не получал никаких исключений, и сообщения отладки показывают, что код проходит через каждый каталог/подкаталог и меняет группу для файла. Но, когда я делаю «ls -l» в окне unix, я не могу видеть измененную группу/владельца для этих файлов? Есть идеи ? –

0

Я бы выбрал JCraft's JSch library (Java Secure Channel). Он делает SSH для java, позволяя вам аутентифицироваться как пользователь, а затем выдавать chmod или chown запросы на контент ваших сердец!

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

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); 
Смежные вопросы