source

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

factcode 2022. 9. 6. 22:18
반응형

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

Java에서는 파일 세트를 동적으로 만들고 있으며, Linux/unix 파일 시스템에서 이러한 파일에 대한 파일 권한을 변경하고 싶습니다.다음 Java를 실행할 수 있으면 좋겠습니다.chmod자바5가 가능합니까?만약 그렇다면, 어떻게?

자바6에서는File오브젝트에는setReadable()/setWritable()방법들.시스템 호출을 할 수 있다는 것도 알지만 가능하면 피하고 싶습니다.

Java 7에서는 "New" New IO Facility(NIO.2)의 일부로서 파일 속성에 대한 완전한 제어를 사용할 수 있습니다.예를 들어, POSIX 권한은 가 있는 기존 파일에 설정하거나 또는 와 같은 메서드를 사용하여 파일 작성 시 atomically로 설정할 수 있습니다.

다음을 사용하여 권한 세트를 생성할 수 있습니다.EnumSet.of()단, 도우미 방식은 많은 개발자가 보다 쉽게 읽을 수 있는 기존 형식을 사용합니다.를 받아들이는 API의 경우FileAttribute사용 권한 세트를 로 랩할 수 있습니다.

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

이전 버전의 Java에서는 사용자 고유의 네이티브 코드를 사용하거나exec-ing 명령줄 유틸리티는 일반적인 접근법입니다.

에릭슨의 제안 외에도 jna도 있어 jni를 사용하지 않고도 네이티브 도서관에 전화를 걸 수 있습니다.놀라울 정도로 사용하기 쉽고, 몇 가지 프로젝트에서 큰 성공을 거두고 있습니다.

단, jni보다 속도가 느리다는 점만 주의해 주십시오.따라서 대량의 파일에 대해 이 작업을 수행할 경우 문제가 될 수 있습니다.

(예시를 추가하기 위해 편집 중)

다음은 완전한 jen 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 수준에서의 파일 권한 업데이트는 지원되지 않습니다.독자적인 네이티브 메서드 또는 콜을 구현해야 합니다.Runtime.exec()chmod 등의 OS 레벨명령어를 실행합니다.

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

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를 탑재한 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()));
}

나중에 다른 사람이 발견하지 않는 한 이 답변을 업데이트하기 위해 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 타입의 액세스를 원했습니다.모든 사용자에게 옵션이 설정됩니다.

작성한 파일에 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);
}

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

Apache ant chmod (완전성을 위해 추가) 크레딧을 @msorsky와 공유

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

Ouralce 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에서 동작합니다.

Oracle Docs에는 UNIX chmod와 매우 유사하게 작동하는 예제 클래스가 있습니다.java se 7+에서는 동작합니다.

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

언급URL : https://stackoverflow.com/questions/664432/how-do-i-programmatically-change-file-permissions

반응형