답변:
파일 속성에 대한 모든 권한은 "새로운"새 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
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
. 또한 종료 후크를 추가하지만 일부 애플리케이션의 경우 여전히 문제가 될 수 있습니다.
@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();
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();
}
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);
}
}
Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxr-x---"))