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


115

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

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


2
기타 참고 사항 : 기존 파일의 경우 Java 7 Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxr-x---"))
tom

답변:


110

파일 속성에 대한 모든 권한은 "새로운"새 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 명령 줄 유틸리티를 사용하는 것이 일반적인 접근 방식입니다.


4
Marty Lamb의 대답을 사용할 수 없기 때문에 이것을 선택합니다.
Roy Rico

1
나는 그들이 NIO.2 작업을 시작한 지 6 년이 넘었고 아직 JRE를 출시하지 않았다는 것을 진지하게 믿을 수 없습니다.
clee

8
코드 예제가 답변에 유용 할 수 있습니다.
Ricardo Gladwell 2013 년

2
@PixelsTech 의이 답변 stackoverflow.com/a/32331442/290182 는 예제 코드를 제공하기 때문에 우수합니다
beldaz

1
@SteveB 모두 설정되었습니다.
erickson

43

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);
}

1
JNA는 네이티브 호출을위한 멋진 도구입니다!
erickson

3
올바른 오류 처리를 위해 com.sun.jna.LastErrorException이 발생하도록 CLibrary.chmod ()를 선언해야합니다. 이것이 chmod () 호출로 설정된 errno 값을 얻는 유일한 스레드 안전 방법입니다. 그렇지 않으면 반환 값에서 성공 / 실패 상태를 얻을 수 있지만 실제 오류 코드는 얻을 수 없습니다.
사이먼 Kissane

30

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 시스템에서는 호출 할 수 없습니다.

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


18

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()));
}

1
이것은 잘 작동합니다. 유일한 수정은 lookupPrincipalByName () 메서드에 대한 것이었고 "user"대신 System.getProperty ( "user.name")를 보냈습니다. 마지막으로 upls.lookupPrincipalByName (System.getProperty ( "user.name")); 코드 감사합니다!
isuru chathuranga 2013-08-06

@bob ..이 캔트 해결 .. 당신이 대답이 작동하는 것 같군 BCZ 당신이 .. 나에게 AclFileAttributeView 및 UserPrincipalLookupService 클래스를 제공합니다 .. 그리고 난 구현 할 수 있습니다
사가르 Chavada에게

java.nio.file.attribute.AclFileAttributeView 및 java.nio.file.attribute.UserPrincipalLookupService, 컴파일 및 실행하려면 jdk 1.7 이상이 필요합니다.

11

생성 된 파일에 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);
}

10

아무도 나중에 이것을 발견하지 않는 한이 답변을 업데이트하기 위해 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 유형 액세스를 원한다는 것을 알고 있습니다. 이 옵션은 모든 사용자를 위해 전반적으로 옵션을 설정합니다.


쿨, 르 소비 르!
khawarizmi 2010

나는 데비안에서 Openjdk 11.0.6으로 아직 테스트했지만 작동합니다!
Hartmut Schorrig


3

Oralce Java 6 :

private static int chmod(String filename, int mode) {
    try {
        Class<?> fspClass = Class.forName("java.util.prefs.FileSystemPreferences");
        Method chmodMethod = fspClass.getDeclaredMethod("chmod", String.class, Integer.TYPE);
        chmodMethod.setAccessible(true);
        return (Integer)chmodMethod.invoke(null, filename, mode);
    } catch (Throwable ex) {
        return -1;
    }
}

solaris / linux에서 작동합니다.


일단로드되면 데몬 스레드 를 FileSystemPreferences스완 한다는 것을 알고 있어야합니다 Timer. 또한 종료 후크를 추가하지만 일부 애플리케이션의 경우 여전히 문제가 될 수 있습니다.
thrau

2

@msorsky와 공유 된 Apache ant chmod (매우 우아하지 않고 완전성을 위해 추가) 크레딧

    Chmod chmod = new Chmod();
    chmod.setProject(new Project());
    FileSet mySet = new FileSet();
    mySet.setDir(new File("/my/path"));
    mySet.setIncludes("**");
    chmod.addFileset(mySet);
    chmod.setPerm("+w");
    chmod.setType(new FileDirBoth());
    chmod.execute();

1
simple java code  for change file permission in java  

   String path="D:\\file\\read.txt";
        File file=new File(path);
        if (file.exists()) {
            System.out.println("read="+file.canRead());
            System.out.println("write="+file.canWrite());
            System.out.println("Execute="+file.canExecute());
            file.setReadOnly();
        }     

참고 : Java에서 파일 권한을 변경하는 방법



0
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class FileAndDirectory1 {
    public static void main(String[] args) {
        
        File file = new File("fileTest1.txt");
        System.out.println(file.getAbsoluteFile());
        try {
            //file.createNewFile();
            if(!file.exists())
            {
                //PosixFilePermission is an enum class, PosixFilePermissions is a final class
                
                //create file permissions from string
                Set<PosixFilePermission> filePermissions = PosixFilePermissions.fromString("---------"/* "rwxrwxrwx" */);
                FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(filePermissions);
                Files.createFile(file.toPath(), permissions);
                // printing the permissions associated with the file
                System.out.println("Executable: " + file.canExecute());
                System.out.println("Readable: " + file.canRead());
                System.out.println("Writable: "+ file.canWrite());

                file.setExecutable(true);
                file.setReadable(true);
                file.setWritable(true);
            }
            else
            {
                //modify permissions
                
                //get the permission using file attributes
                Set<PosixFilePermission> perms = Files.readAttributes(file.toPath(), PosixFileAttributes.class).permissions();
                perms.remove(PosixFilePermission.OWNER_WRITE);

                perms.add(PosixFilePermission.OWNER_READ);
                perms.add(PosixFilePermission.OWNER_EXECUTE);
                perms.add(PosixFilePermission.GROUP_WRITE);
                perms.add(PosixFilePermission.GROUP_READ);
                perms.add(PosixFilePermission.GROUP_EXECUTE);
                perms.add(PosixFilePermission.OTHERS_WRITE);
                perms.add(PosixFilePermission.OTHERS_READ);
                perms.add(PosixFilePermission.OTHERS_EXECUTE);
                Files.setPosixFilePermissions(file.toPath(), perms);

                System.out.println("Executable: " + file.canExecute());
                System.out.println("Readable: " + file.canRead());
                System.out.println("Writable: "+ file.canWrite());

                file.delete();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        Path path = Paths.get(String.valueOf(file));
        System.out.println(path);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.