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 유형 액세스를 원한다는 것을 알고 있습니다. 이 옵션은 모든 사용자를 위해 전반적으로 옵션을 설정합니다.