Как программно изменять права доступа к файлам?
В Java я динамически создаю набор файлов, и я хотел бы изменить права доступа к файлам в этих файлах в файловой системе linux/unix. Я бы хотел выполнить Java-эквивалент chmod
. Возможно ли это, что Java 5? Если да, то как?
Я знаю, что в Java 6 объект File имеет методы setReadable()/setWritable(). Я также знаю, что могу сделать системный вызов, чтобы сделать это, но я хотел бы избежать этого, если это возможно.
Ответы
Ответ 1
Полный контроль над файловыми атрибутами доступен в Java 7 как часть "нового" объекта ввода нового ввода-вывода (NIO.2). Например, разрешения POSIX могут быть установлены с помощью setPosixFilePermissions()
.
В более ранних версиях Java, используя собственный собственный код, или утилиты командной строки exec
-ing являются общими подходами.
Ответ 2
В дополнение к предложениям erickson также есть jna, который позволяет вам называть родные библиотеки без использования jni. Это потрясающе удобно в использовании, и я использовал его на нескольких проектах с большим успехом.
Единственное предостережение в том, что оно медленнее 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);
}
Ответ 3
для Windows 7 с nio 2.0:
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()));
}
Ответ 4
До версии Java 6 поддержка обновления разрешений на уровне Java не поддерживается. Вы должны реализовать собственный собственный метод или вызвать Runtime.exec()
для выполнения команды уровня ОС, например chmod.
Начиная с 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.
Подробнее об управлении разрешениями файлов рекомендуем прочитать этот пост.
Ответ 5
Если вы хотите установить разрешение 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.OWNER_EXECUTE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_EXECUTE);
Files.setPosixFilePermissions(file.toPath(), perms);
}
Ответ 6
Вы можете использовать методы класса File:
http://docs.oracle.com/javase/7/docs/api/java/io/File.html
Ответ 7
для 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.
Ответ 8
В дополнение к erickson ответьте здесь на полезную ссылку с примерами рабочих примеров использования PosixFilePermissions:
http://www.journaldev.com/855/how-to-set-file-permissions-in-java-easily-using-java-7-posixfilepermission
Ответ 9
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();
Ответ 10
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
Ответ 11
В Oracle Docs есть класс который очень похож на UNIX chmod. Он работает с java se 7+, хотя.