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


115

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

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


2
:他の人のための注意:既存のファイルについては、Java 7以来、あなたはこのワンライナーを使用することができますFiles.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxr-x---"))
トム

回答:


110

Java 7では、「新しい」新しいIO機能(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コマンドラインユーティリティを使用するのが一般的なアプローチです。


4
マーティラムの答えを使用する能力がないので、これを選択します。
ロイ・リコ

1
彼らがNIO.2に取り組み始めてから6年以上が経過し、まだ​​出荷中のJREには含まれていないとは、私には真剣に信じられません。
clee

8
コード例はあなたの答えに役立つかもしれません。
Ricardo Gladwell 2013

2
@PixelsTechによるこの回答stackoverflow.com/a/32331442/290182は、サンプルコードを提供するため優れています
beldaz

1
@SteveBすべての設定。
エリクソン2018

43

エリクソンの提案に加えて、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);
}

1
JNAはネイティブコールに最適なツールです。
エリクソン2009年

3
エラーを正しく処理するには、CLibrary.chmod()を宣言してcom.sun.jna.LastErrorExceptionをスローする必要があります。これが、chmod()呼び出しによって設定されたerrno値を取得する唯一のスレッドセーフな方法です。それ以外の場合は、戻り値から成功/失敗のステータスを取得できますが、実際のエラーコードは取得できません。
Simon Kissane 2013年

30

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

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


18

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

1
これはうまくいきます。行われた唯一の変更はlookupPrincipalByName()メソッドに対するものであり、「user」の代わりにSystem.getProperty( "user.name")を送信しました。最後に、upls.lookupPrincipalByName(System.getProperty( "user.name"));のようになりました。コードをありがとう!
isuru chathuranga 2013

@bob .. AclFileAttributeViewとUserPrincipalLookupServiceクラスを教えてもらえますか.. bczそれは解決できません..答えは機能しているようです..実装したいと思います
Sagar Chavada

java.nio.file.attribute.AclFileAttributeViewおよびjava.nio.file.attribute.UserPrincipalLookupService、コンパイルして実行するにはjdk 1.7以降が必要です。
ボブは

11

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

10

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タイプのアクセスを必要としていたことを知っています。これらは、すべてのユーザーに対して全面的にオプションを設定します。


クール、ル・ソヴール!
khawarizmi

DebianでOpenjdk 11.0.6を使用してまだテストしましたが、動作します!
Hartmut Schorrig


3

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で動作します。


デーモンスレッドがFileSystemPreferences読み込まれると、Timerデーモンスレッドが起動されることに注意してください。また、シャットダウンフックも追加されますが、一部のアプリケーションでは、これが依然として問題となる場合があります。
thrau

2

@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();



0
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class FileAndDirectory1 {
    public static void main(String[] args) {
        
        File file = new File("fileTest1.txt");
        System.out.println(file.getAbsoluteFile());
        try {
            //file.createNewFile();
            if(!file.exists())
            {
                //PosixFilePermission is an enum class, PosixFilePermissions is a final class
                
                //create file permissions from string
                Set<PosixFilePermission> filePermissions = PosixFilePermissions.fromString("---------"/* "rwxrwxrwx" */);
                FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(filePermissions);
                Files.createFile(file.toPath(), permissions);
                // printing the permissions associated with the file
                System.out.println("Executable: " + file.canExecute());
                System.out.println("Readable: " + file.canRead());
                System.out.println("Writable: "+ file.canWrite());

                file.setExecutable(true);
                file.setReadable(true);
                file.setWritable(true);
            }
            else
            {
                //modify permissions
                
                //get the permission using file attributes
                Set<PosixFilePermission> perms = Files.readAttributes(file.toPath(), PosixFileAttributes.class).permissions();
                perms.remove(PosixFilePermission.OWNER_WRITE);

                perms.add(PosixFilePermission.OWNER_READ);
                perms.add(PosixFilePermission.OWNER_EXECUTE);
                perms.add(PosixFilePermission.GROUP_WRITE);
                perms.add(PosixFilePermission.GROUP_READ);
                perms.add(PosixFilePermission.GROUP_EXECUTE);
                perms.add(PosixFilePermission.OTHERS_WRITE);
                perms.add(PosixFilePermission.OTHERS_READ);
                perms.add(PosixFilePermission.OTHERS_EXECUTE);
                Files.setPosixFilePermissions(file.toPath(), perms);

                System.out.println("Executable: " + file.canExecute());
                System.out.println("Readable: " + file.canRead());
                System.out.println("Writable: "+ file.canWrite());

                file.delete();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        Path path = Paths.get(String.valueOf(file));
        System.out.println(path);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.