13 Stimmen

Verzeichnis mit Schreibberechtigung für die Gruppe erstellen

Ich erstelle einen Ordner in meinem Java-Programm (das unter Linux läuft) mit der Funktion mkdirs() des File-Objekts. Das Problem ist, dass der Ordner nur Leserechte für die Gruppe erhält. Ich brauche aber auch Schreibrechte (um die Dateien später löschen zu können). Wie kann ich das erreichen?

19voto

user1679437 Punkte 199

Hierfür gibt es eine sehr einfache Lösung:

file.setExecutable(true, false);
file.setReadable(true, false);
file.setWritable(true, false);

Im obigen Code ist file ein File-Objekt.

Wenn Sie eine Datei erstellen, setzen Sie diese Berechtigungen für eine Datei setExecutable(true) ermöglicht es Ihnen, diese Datei als Executable nur für Eigentümer. Wenn Sie einen weiteren Parameter hinzufügen, den ich im obigen Code hinzugefügt habe file.setExecutable(true, false); wird machen Executable false nur für den Besitzer, d.h. es werden die Berechtigungen für alle Gruppen/Welt gesetzt.

Getestet und funktioniert unter Debian und Windows XP.

2 Stimmen

Eine bessere Lösung ist die Verwendung von Java Nio, da diese Lösung Berechtigungen nur für einen Eigentümer oder für alle festlegt.

1 Stimmen

Das funktioniert bei mir nicht. Ich habe versucht, ein Verzeichnis unter dem Root-Ordner (auf Linux) mit einer Java-Anwendung zu erstellen (der Benutzer ist Tomcat), aber es schlägt fehl, auch wenn ich if (!rootFile.canWrite()) { rootFile.setWritable(true, true); } Ich habe den Eindruck, dass der Tomcat-Benutzer die Berechtigung für Verzeichnisse/Dateien nicht ändern kann.

1 Stimmen

Die Frage bezieht sich auf die Erlaubnis für eine Gruppe, nicht für alle!

11voto

Sylvain Punkte 781

Java nio kann mit Posix-Dateiattributen helfen: https://docs.oracle.com/javase/8/docs/api/java/nio/file/attribute/PosixFileAttributeView.html

Path path = ...
 Set<PosixFilePermission> perms =
     EnumSet.of(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_WRITE);
 Files.createFile(path, PosixFilePermissions.asFileAttribute(perms));

2 Stimmen

PosixFilePermission ist nur für die portablen Betriebssysteme. PosixFilePermission funktioniert nicht mit Windows-Systemen

2voto

David Z Punkte 121773

Ich vermute (bis jemand eine gegenteilige Antwort gibt), dass es keine Möglichkeit gibt, dies in der Java-Standardbibliothek zu tun, weil POSIX-Gruppenberechtigungen (die rwxrwxrwx Art, die Sie gewohnt sind) nicht plattformübergreifend sind. Mit Java 6 können Sie zwar Eigentümerrechte oder globale Rechte setzen, aber (soweit ich weiß) keine Gruppenrechte. Wenn Sie es wirklich tun müssen, versuchen Sie es mit Runtime.exec("chmod g+w directory") zu verwenden, aber es könnte stilistisch eine gute Idee sein, sie in eine Methode wie setGroupWritable() .

1 Stimmen

Es ist nicht schön, aber es macht die Arbeit. Nur für Copy/Paste: Es muss Runtime.getRuntime.exec("chmod g+w directory") sein

0 Stimmen

@schoenk - Runtime.getRuntime().exec("chmod g+w directory); ?

1voto

sateesh Punkte 26553

OK, das ist keine Java-Lösung und definitiv nicht portabel.

Da Sie erwähnen, dass Sie unter Linux arbeiten, können Sie vielleicht die "umask"-Einstellungen überprüfen und entsprechend einstellen (damit Verzeichnisse mit Gruppenschreibrechten erstellt werden) und dann Ihr Java-Programm starten.

-1voto

Rob Lachlan Punkte 14109

In Java 6 gibt es Methoden, die dies ermöglichen, wie setwriteable(). Bei früheren Versionen von Java müssen Sie auf die Befehlszeile zugreifen, um einen chmod-Befehl auszuführen.

Java 6 SE File Class Doc.

EDIT: Hoppla, ich habe mich geirrt; ich habe übersehen, dass Sie speziell Gruppenberechtigungen haben wollten. Diese scheinen ohne Runtime.exec() nicht einstellbar zu sein.

@David: Du hast Recht.

Ein weiterer Gedanke: Wenn Sie viele Dateien zu ändern haben, wie wäre es, ein Shell-Skript zu schreiben und dieses von runtime.exec() aus aufzurufen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X