Как программно изменить права доступа к файлам? - PullRequest
102 голосов
/ 20 марта 2009

В Java я динамически создаю набор файлов, и я хотел бы изменить права доступа к файлам для этих файлов в файловой системе linux / unix. Я хотел бы иметь возможность выполнить Java эквивалент chmod. Это возможно Java 5? Если да, то как?

Я знаю, что в Java 6 File объект имеет setReadable() / setWritable() методы. Я также знаю, что могу сделать системный вызов, но я бы хотел этого избежать, если это возможно.

Ответы [ 12 ]

98 голосов
/ 20 марта 2009

Полный контроль над атрибутами файлов доступен в Java 7 как часть «нового» средства ввода-вывода ( NIO.2 ). Например, разрешения 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.

42 голосов
/ 20 марта 2009

В дополнение к предложениям Эриксона, есть также 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);
}
25 голосов
/ 01 сентября 2015

До 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.

Для получения подробной информации об управлении разрешениями файлов, рекомендуем прочитать этот пост .

17 голосов
/ 15 декабря 2012

для 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()));
}
9 голосов
/ 29 марта 2017

Если вы хотите установить разрешение 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);
}
4 голосов
/ 31 марта 2013

для 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.

4 голосов
/ 26 сентября 2011

Вы можете использовать методы класса File: http://docs.oracle.com/javase/7/docs/api/java/io/File.html

3 голосов
/ 02 июля 2014

В дополнение к ответу Эриксона, здесь есть полезная ссылка с примерами рабочего кода по использованию PosixFilePermissions:

http://www.journaldev.com/855/how-to-set-file-permissions-in-java-easily-using-java-7-posixfilepermission

2 голосов
/ 11 апреля 2019

Просто чтобы обновить этот ответ, если никто не сталкивался с этим позже, начиная с JDK 6 вы можете использовать

File file = new File('/directory/to/file');
file.setWritable(boolean);
file.setReadable(boolean);
file.setExecutable(boolean);

вы можете найти документацию по файлу Oracle (Java Platform SE 7) . Помните, что эти команды работают только в том случае, если текущий работающий пользователь имеет право собственности или права на запись в этот файл. Я знаю, что OP хотел получить доступ типа chmod для более сложной пользовательской конфигурации. они установят опцию по всем направлениям для всех пользователей.

2 голосов
/ 15 декабря 2013

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...