[java] 프로그래밍 방식으로 파일 권한을 변경하려면 어떻게합니까?

Java에서는 동적으로 파일 집합을 만들고 Linux / unix 파일 시스템에서 이러한 파일에 대한 파일 권한을 변경하고 싶습니다. 에 해당하는 Java를 실행할 수 있기를 바랍니다 chmod. 가능한 Java 5입니까? 그렇다면 어떻게?

Java 6에서 File객체에 setReadable()/ setWritable()메소드 가 있음을 알고 있습니다. 이 작업을 수행하기 위해 시스템 호출을 할 수 있다는 것도 알고 있지만 가능하면이를 피하고 싶습니다.



답변

파일 속성에 대한 모든 권한은 “새로운”새 IO 기능 ( NIO.2 )의 일부로 Java 7에서 사용할 수 있습니다 . 예를 들면 POSIX 권한이있는 기존 파일에 설정 될 수있는 setPosixFilePermissions(), 같은 방법으로 파일 생성시에 원자 또는 createFile()newByteChannel().

을 사용하여 권한 집합을 만들 수 EnumSet.of()있지만 도우미 메서드 PosixFilePermissions.fromString()는 많은 개발자가 더 쉽게 읽을 수있는 일반적인 형식을 사용합니다. 을 허용하는 API FileAttribute의 경우 권한 집합을 PosixFilePermissions.asFileAttribute().

Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(path, permissions);

이전 버전의 Java에서는 고유 한 고유 코드 또는 exec-ing 명령 줄 유틸리티를 사용하는 것이 일반적인 접근 방식입니다.


답변

erickson의 제안 외에도 jni를 사용하지 않고 네이티브 라이브러리를 호출 할 수있는 jna 도 있습니다. 놀랍게도 사용하기 쉬우 며, 몇 가지 프로젝트에서 큰 성공을 거두었습니다.

유일한주의 사항은 jni보다 느리므로 문제가 될 수있는 매우 많은 수의 파일에 대해이 작업을 수행하는 경우입니다.

(예제 추가 편집)

다음은 완전한 jna chmod 예제입니다.

import com.sun.jna.Library;
import com.sun.jna.Native;

public class Main {
    private static CLibrary libc = (CLibrary) Native.loadLibrary("c", CLibrary.class);

    public static void main(String[] args) {
        libc.chmod("/path/to/file", 0755);
    }
}

interface CLibrary extends Library {
    public int chmod(String path, int mode);
}


답변

Java 6 이전에는 Java 수준에서 파일 권한 업데이트가 지원되지 않습니다. 자체 네이티브 메서드를 구현하거나 chmodRuntime.exec() 와 같은 OS 수준 명령을 실행하기 위해 호출 해야 합니다.

Java 6부터 File.setReadable()/File.setWritable()/File.setExecutable()파일 권한을 설정 하는 데 사용할 수 있습니다 . 그러나 다른 사용자에 대한 권한을 설정할 수있는 POSIX 파일 시스템을 시뮬레이션하지는 않습니다. File.setXXX ()는 소유자와 다른 모든 사람에게만 권한을 설정할 수 있습니다.

Java 7부터 POSIX 파일 권한이 도입되었습니다. * nix 시스템에서 수행 한 것과 같은 파일 권한을 설정할 수 있습니다. 구문은 다음과 같습니다.

File file = new File("file4.txt");
file.createNewFile();

Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);

Files.setPosixFilePermissions(file.toPath(), perms);

이 메서드는 POSIX 파일 시스템에서만 사용할 수 있습니다. 즉, Windows 시스템에서는 호출 할 수 없습니다.

파일 권한 관리에 대한 자세한 내용은 이 게시물 을 읽어 보시기 바랍니다 .


답변

nio 2.0이 설치된 Windows 7의 경우 :

public static void main(String[] args) throws IOException
{
    Path file = Paths.get("c:/touch.txt");
    AclFileAttributeView aclAttr = Files.getFileAttributeView(file, AclFileAttributeView.class);
    System.out.println(aclAttr.getOwner());
    for(AclEntry aclEntry : aclAttr.getAcl()){
        System.out.println(aclEntry);
    }
    System.out.println();

    UserPrincipalLookupService upls = file.getFileSystem().getUserPrincipalLookupService();
    UserPrincipal user = upls.lookupPrincipalByName(System.getProperty("user.name"));
    AclEntry.Builder builder = AclEntry.newBuilder();
    builder.setPermissions( EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.EXECUTE,
            AclEntryPermission.READ_ACL, AclEntryPermission.READ_ATTRIBUTES, AclEntryPermission.READ_NAMED_ATTRS,
            AclEntryPermission.WRITE_ACL, AclEntryPermission.DELETE
    ));
    builder.setPrincipal(user);
    builder.setType(AclEntryType.ALLOW);
    aclAttr.setAcl(Collections.singletonList(builder.build()));
}


답변

생성 된 파일에 777 권한을 설정하려면 다음 방법을 사용할 수 있습니다.

public void setPermission(File file) throws IOException{
    Set<PosixFilePermission> perms = new HashSet<>();
    perms.add(PosixFilePermission.OWNER_READ);
    perms.add(PosixFilePermission.OWNER_WRITE);
    perms.add(PosixFilePermission.OWNER_EXECUTE);

    perms.add(PosixFilePermission.OTHERS_READ);
    perms.add(PosixFilePermission.OTHERS_WRITE);
    perms.add(PosixFilePermission.OTHERS_EXECUTE);

    perms.add(PosixFilePermission.GROUP_READ);
    perms.add(PosixFilePermission.GROUP_WRITE);
    perms.add(PosixFilePermission.GROUP_EXECUTE);

    Files.setPosixFilePermissions(file.toPath(), perms);
}


답변

아무도 나중에 이것을 발견하지 않는 한이 답변을 업데이트하기 위해 JDK 6을 사용할 수 있습니다.

File file = new File('/directory/to/file');
file.setWritable(boolean);
file.setReadable(boolean);
file.setExecutable(boolean);

Oracle File (Java Platform SE 7) 에 대한 설명서를 찾을 수 있습니다 . 이 명령은 현재 작업중인 사용자에게 소유권이 있거나 해당 파일에 대한 쓰기 권한이있는 경우에만 작동합니다. OP는 더 복잡한 사용자 구성을 위해 chmod 유형 액세스를 원한다는 것을 알고 있습니다. 이 옵션은 모든 사용자를 위해 전반적으로 옵션을 설정합니다.


답변

File 클래스의 메소드를 사용할 수 있습니다.
http://docs.oracle.com/javase/7/docs/api/java/io/File.html