如何以编程方式更改文件权限?

2022-08-31 07:54:02

在Java中,我正在动态创建一组文件,并且我想在linux / unix文件系统上更改这些文件的文件权限。我希望能够执行 Java 等效项 。这有可能 Java 5 吗?如果是这样,如何?chmod

我知道在Java 6中,对象有/方法。我也知道我可以进行系统调用来执行此操作,但如果可能的话,我想避免这种情况。FilesetReadable()setWritable()


答案 1

对文件属性的完全控制在Java 7中可用,作为“新”新IO工具(NIO.2)的一部分。例如,POSIX 权限可以使用 setPosixFilePermissions() 在现有文件上设置,或者在使用 createFile()newByteChannel() 等方法创建文件时以原子方式设置。

您可以使用 创建一组权限,但帮助器方法 PosixFilePermissions.fromString() 将使用传统格式,许多开发人员将更具可读性。对于接受 的 API,您可以使用 PosixFilePermissions.asFileAttribute() 包装权限集。EnumSet.of()FileAttribute

Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(path, permissions);

在早期版本的 Java 中,使用自己的本机代码或 -ing 命令行实用程序是常用方法。exec


答案 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);
}

推荐