How do I programmatically change file permissions?
Как мне программно изменить права доступа к файлам?
В Java я динамически создаю набор файлов, и я хотел бы изменить права доступа к этим файлам в файловой системе Linux / unix. Я хотел бы иметь возможность выполнять Java-эквивалент chmod. Возможно ли это на Java 5? Если да, то каким образом?
Я знаю, что в Java 6 у File объекта есть методы setReadable()/setWritable() . Я также знаю, что мог бы выполнить системный вызов для этого, но я бы хотел избежать этого, если возможно.
Переведено автоматически
Ответ 1
Полный контроль над атрибутами файла доступен в Java 7 как часть "нового" средства ввода-вывода (NIO.2). Например, разрешения POSIX могут быть установлены для существующего файла с помощью setPosixFilePermissions(), или атомарно при создании файла с помощью таких методов, как createFile() или newByteChannel().
Вы можете создать набор разрешений с помощью EnumSet.of(), но вспомогательный метод PosixFilePermissions.fromString() будет использовать обычный формат, который будет более удобочитаемым для многих разработчиков. Для API, которые принимают FileAttribute, вы можете обернуть набор разрешений с помощью PosixFilePermissions.asFileAttribute().
В более ранних версиях Java обычным подходом было использование собственного машинного кода или exec утилит командной строки.
Ответ 2
До Java 6 обновление прав доступа к файлам на уровне Java не поддерживалось. Вы должны реализовать свой собственный собственный метод или вызвать Runtime.exec() для выполнения команды уровня операционной системы, такой как chmod.
Начиная с Java 6, вы можете использоватьFile.setReadable()/File.setWritable()/File.setExecutable() для установки прав доступа к файлам. Но это не имитирует файловую систему POSIX, которая позволяет устанавливать права доступа для разных пользователей. File.setXXX() позволяет устанавливать права доступа только для владельца и всех остальных.
Начиная с Java 7, вводятся права доступа к файлам POSIX. Вы можете установить права доступа к файлам, подобные тому, что вы сделали в системах * nix. Синтаксис таков :
Этот метод можно использовать только в файловой системе POSIX, это означает, что вы не можете вызвать его в системе Windows.
Для получения подробной информации об управлении правами доступа к файлам рекомендую вам прочитать этот пост.
Ответ 3
В дополнение к предложениям Эриксона, существует также jna, которая позволяет вызывать собственные библиотеки без использования jni. Он потрясающе прост в использовании, и я с большим успехом использовал его в паре проектов.
Единственное предостережение заключается в том, что это медленнее, чем jni, поэтому, если вы делаете это с очень большим количеством файлов, это может быть проблемой для вас.