it-swarm.com.de

Wie ändere ich programmgesteuert Dateiberechtigungen?

In Java erstelle ich dynamisch eine Reihe von Dateien und möchte die Dateiberechtigungen für diese Dateien in einem Linux/Unix-Dateisystem ändern. Ich möchte in der Lage sein, das Java Äquivalent von chmod auszuführen. Ist das möglich Java 5? Wenn ja, wie?

Ich kenne in Java 6 das File Objekt hat setReadable()/setWritable() Methoden. Ich weiß auch, dass ich einen Systemaufruf machen könnte tun Sie dies, aber ich möchte das nach Möglichkeit vermeiden.

105
Roy Rico

Die vollständige Kontrolle über Dateiattribute ist in Java 7 als Teil der "neuen" New IO facility ( NIO verfügbar .2 . Beispielsweise können POSIX-Berechtigungen für eine vorhandene Datei mit setPosixFilePermissions(), oder atomar bei der Dateierstellung mit Methoden wie createFile() oder newByteChannel().

Sie können mit EnumSet.of() eine Reihe von Berechtigungen erstellen, aber die Hilfsmethode PosixFilePermissions.fromString() verwendet ein herkömmliches Format Das wird für viele Entwickler besser lesbar sein. Für APIs, die ein FileAttribute akzeptieren, können Sie den Berechtigungssatz mit PosixFilePermissions.asFileAttribute() umbrechen.

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

In früheren Versionen von Java sind die Verwendung von eigenem Code oder execgebräuchlichen Befehlszeilendienstprogrammen übliche Ansätze.

99
erickson

Zusätzlich zu Ericksons Vorschlägen gibt es auch jna , mit dem Sie native Bibliotheken aufrufen können, ohne jni zu verwenden. Es ist schockierend einfach zu bedienen und ich habe es bei einigen Projekten mit großem Erfolg eingesetzt.

Die einzige Einschränkung ist, dass es langsamer als jni ist. Wenn Sie dies also für eine sehr große Anzahl von Dateien tun, könnte dies ein Problem für Sie sein.

(Bearbeitung zum Beispiel hinzufügen)

Hier ist ein vollständiges Beispiel für 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

Vor Java 6 wird das Aktualisieren von Dateiberechtigungen auf Java Level nicht unterstützt. Sie müssen Ihre eigene native Methode implementieren oder Runtime.exec() aufrufen. Befehl auf Betriebssystemebene wie chmod ausführen.

Ab Java 6 können Sie mitFile.setReadable()/File.setWritable()/File.setExecutable() Dateiberechtigungen festlegen. Das POSIX-Dateisystem, mit dem Berechtigungen für verschiedene Benutzer festgelegt werden können, wird jedoch nicht simuliert. File.setXXX () Ermöglicht nur das Festlegen der Berechtigung für den Eigentümer und alle anderen.

Ab Java 7 wird die POSIX-Dateiberechtigung eingeführt. Sie können Dateiberechtigungen wie auf * nix-Systemen festlegen. Die Syntax lautet:

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

Diese Methode kann nur im POSIX-Dateisystem verwendet werden, dh, Sie können sie nicht im Windows-System aufrufen.

Für Details zur Dateiberechtigungsverwaltung empfehlen wir Ihnen, diesen Beitrag zu lesen.

26
PixelsTech

für Windows 7 mit 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()));
}
17
bob

Wenn Sie die 777-Berechtigung für Ihre erstellte Datei festlegen möchten, können Sie die folgende Methode verwenden:

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

Sie können die Methoden der File-Klasse verwenden: http://docs.Oracle.com/javase/7/docs/api/Java/io/File.html

4

für 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;
    }
}

funktioniert unter Solaris/Linux.

4
Vlad

Nur um diese Antwort zu aktualisieren, es sei denn, jemand stößt später darauf, da Sie JDK 6 verwenden können

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

sie finden die Dokumentation unter Oracle File (Java Platform SE 7) . Beachten Sie, dass diese Befehle nur funktionieren, wenn der aktuelle Benutzer Eigentümer dieser Datei ist oder Schreibzugriff auf diese Datei hat. Mir ist bekannt, dass OP den Zugriff vom Typ chmod für komplexere Benutzerkonfigurationen wünschte. Dadurch wird die Option für alle Benutzer allgemein festgelegt.

3
TravisF

Zusätzlich zu Ericksons Antwort hier ein hilfreicher Link mit Arbeitscode-Beispielen zur Verwendung von PosixFilePermissions:

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

3
t-h-

Apache ant chmod (der Vollständigkeit halber nicht sehr elegant) Kredit, der mit @msorsky geteilt wird

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

Referenz: wie man die Dateiberechtigung in Java ändert

1
Anuj Dhiman

Es gibt eine Beispielklasse für Oracle Docs , die dem UNIX-chmod sehr ähnlich ist. Es funktioniert jedoch mit Java se 7+.

0
jan.supol