web-dev-qa-db-ja.com

プログラムでファイルのアクセス許可を変更するにはどうすればよいですか?

Javaでは、一連のファイルを動的に作成しているので、linux/unixファイルシステム上のこれらのファイルのファイル許可を変更したいと思います。 Javaと同等のchmodを実行できるようにしたいと思います。 Java 5は可能ですか?もしそうなら、どのように?

Java 6で、FileオブジェクトにはsetReadable()/setWritable()メソッドがあります。また、これを行うためにシステムコールを行うこともできますが、可能であればそれを避けたいと思います。

105
Roy Rico

ファイル属性の完全な制御は、「新しい」新しいJava機能の一部としてIO 7で利用可能です( NIO.2 )。たとえば、POSIX権限は、 setPosixFilePermissions() で既存のファイルに設定するか、 などのメソッドを使用してファイル作成時にアトミックに設定できますcreateFile() または newByteChannel()

EnumSet.of()を使用して一連の権限を作成できますが、ヘルパーメソッド PosixFilePermissions.fromString() は、多くの開発者にとって読みやすい従来の形式を使用します。 FileAttributeを受け入れるAPIの場合、一連の権限を PosixFilePermissions.asFileAttribute() でラップできます。

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

Javaの以前のバージョンでは、独自のネイティブコードまたはexec- ingコマンドラインユーティリティを使用するのが一般的なアプローチです。

99
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);
}
42
Marty Lamb

Java 6より前は、Javaレベルでのファイル許可の更新はサポートされていません。独自のネイティブメソッドを実装するか、Runtime.exec()を呼び出して、chmodなどのOSレベルコマンドを実行する必要があります。

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システムで呼び出すことはできません。

ファイル許可管理の詳細については、 この投稿 を読むことをお勧めします。

26
PixelsTech

nio 2.0を搭載したWindows 7の場合:

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()));
}
17
bob

作成したファイルに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);
}
9

Fileクラスのメソッドを使用できます。 http://docs.Oracle.com/javase/7/docs/api/Java/io/File.html

4

oracle 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
Vlad

JDK 6を使用できるので、後で誰かがこれに遭遇しない限り、この答えを更新するために

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

oracle File(Java Platform SE 7) でドキュメントを見つけることができます。これらのコマンドは、現在作業中のユーザーがそのファイルへの所有権または書き込みアクセス権を持っている場合にのみ機能することに注意してください。 OPは、より複雑なユーザー設定のためにchmodタイプのアクセスを望んでいたことを認識しています。これらは、すべてのユーザーに対してオプションを全面的に設定します。

3
TravisF

ここでのエリクソンの回答に加えて、PosixFilePermissionsの使用に関する実用的なコード例との役立つリンク:

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

3
t-h-

@msorskyと共有されるApache ant chmod(完全ではないがエレガントに追加)クレジット

    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();
2
ihadanny
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でファイル許可を変更する方法

1
Anuj Dhiman

Oracle Docsのサンプルクラス があり、UNIXのchmodと非常によく似ています。ただし、Java se 7+で動作します。

0
jan.supol