Как программно изменять права доступа к файлам?

В 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);
}

Ответ 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.

Ответ 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