# Ordnerrechte / Zugriffsrechte mit Java ändern?



## alphaChill (13. Jan 2009)

Hallo

gibt es eine Möglichkeit die Rechte mit Java an Ordner zu vergeben?

Hätter gern, dass ein Ordner (und dessen Inhalt) nur von einem Programm geändert und glöscht werden kann (also für den User "Read-Only"). Kann das Java? Wenn ja, welches Paket beinhaltet diese Funktion? (Wenn ihr mir dann noch die Klasse und die Methode nenne könnt, erspart ihr mir Sucharbeit  )

Wenn nicht, kann ich etwas mit 

```
Process proc = Runtime.getRuntime().exec(...);
```
unter Windows tricksen?


----------



## Wildcard (13. Jan 2009)

Dieses Schreibgeschützt Flag unter Windows ist kein Zugriffschutz sondern eine Art Hint.
User startet ein Programm -> Programm schreibt Datei mit den Rechten des Users -> Datei gehört User
Diese Rechte lassen sich mit den entsprechenden Programmen des Betriebssystems allerdings nachträglich ändern.
Unix zB chmod/chown/...


----------



## Ebenius (14. Jan 2009)

Ich arbeite normaler Weise mit Java 5, da geht sowas meines Wissens nicht in Java. Daher kann ich nur vermuten, dass Dir vielleicht die Java 6-Neuerungen in java.io.File helfen könnten: File.setReadable(boolean, boolean) und File.setWritable(boolean, boolean).

Grüße, Ebenius


----------



## alphaChill (15. Jan 2009)

@ Wildecard: Jo, unter Unix und Linux-Betriebsystemen sind mir die Befehle bekannt, nur schade, dass es soetwas nicht unter Windows gibt...

@ Ebenius: Danke für den Tipp... mit "setWritable" (false) und "setReadable" (true) kann ich leider "nur" verhindern, dass man die entsprechende Datei abändern kann, allerdings kann man das Löschen der Datei dadurch nicht verhindern 

Aber sowie ich das Wildecard erklärt hat, wird es wohl keine Möglichkeit unter Windows geben, da etwas zu machen, wenn das Programm dem User gehört und das Programm mit "Userrechten" arbeitet.

Kann man wenigestens irgendwie prüfen, ob ein bestimmter Ordner geöffnet ist, dass man dann eine Meldung rausgibt, die einem vor dem Abändern der Dateien in diesem Ordner warnt?
'ne Klasse "Folder" und die Methode "isOpen()" wäre in dem Fall hilfreich  :lol: scheint es nur im Java-io-Paket  nicht zu geben  wäre ja wahrscheinlich auch zu einfach gewesen...


----------



## Wildcard (15. Jan 2009)

Vista hat doch eine rudimentäre Rechteverwaltung. Sollte doch auch ein Programm geben um die Rechte zu ändern.



> Kann man wenigestens irgendwie prüfen, ob ein bestimmter Ordner geöffnet ist, dass man dann eine Meldung rausgibt, die einem vor dem Abändern der Dateien in diesem Ordner warnt?


Verzeichnisse sind nicht offen oder geschlossen. Ein solcher Zustand existiert nicht.


----------



## Saxony (16. Jan 2009)

Wildcard hat gesagt.:
			
		

> Verzeichnisse sind nicht offen oder geschlossen. Ein solcher Zustand existiert nicht.



Zumindest scheint es aber den Zustand der Verwendung zu geben.

c:\mkdir "neuer Ordner"

c:\cd "neuer Ordner"

c:\neuer Ordner\

So und jetzt mal versuchen vom WindowsExplorer aus c:\neuer Ordner\ zu löschen. Die Frage ist nur ob man mit JavaBordMitteln an diesen Status ran kommt - ich habe davon jedenfalls noch nichts gehört.

Eine unbefriedigende Lösung ist mittel C/C++, WinAPI und JNI realisierbar. Müsste aber dann entweder nur auf Win laufen oder für jedes OS ne JNI Implementierung coden.

bye Saxony


----------



## alphaChill (16. Jan 2009)

@ Wildcard: Danke für die Info, aber ich versuch Vista weitestgehend aus dem Weg zu gehen, allein schon mal aus dem Grund, dass alleine das Betriebsystem meinen Rechner völlig in die Knie zwingen würde, aber gut das ist ein anderes Thema ;-)

@Saxony: C++ habe ich zwar schon erste Schritte gemacht, aber ich denke bis ich das hinbekommen würde, würde einige Zeit vergehen, mal sehen...

Mir ist allerdings noch etwas anderes eingefallen: Wenn es schon nicht die Zustände "Offen" und "Geschlossen" gibt, kann man ggf. prüfen ob ein Ordner aufgerufen wurde? Oder, dass man ein Programm mit einem Ordner verknüpft, so dass man den Ordner und ein Programm mit einem (Doppelt-)Klick ausfürht.


----------



## Saxony (16. Jan 2009)

alphaChill hat gesagt.:
			
		

> Mir ist allerdings noch etwas anderes eingefallen: Wenn es schon nicht die Zustände "Offen" und "Geschlossen" gibt, kann man ggf. prüfen ob ein Ordner aufgerufen wurde? Oder, dass man ein Programm mit einem Ordner verknüpft, so dass man den Ordner und ein Programm mit einem (Doppelt-)Klick ausfürht.



Ja das ist genau das, was ich mit dem Zustand der Verwendung meinte. Jetzt ist natürlich die Frage woher soll deine JavaApp wissen, dass zum Beispiel MS Word gerade in diesem Ordner ein Dokument offen hat bzw. es für die 34324324 Temp Files für jedes offene Doc braucht. Daher der Vorschlag über WinAPI, der WindowsExplorer findet nämlich auch raus, wenn der Ordner anderswo noch verwendet/offen ist:



			
				WindowsExplorer hat gesagt.:
			
		

> Fehler beim Löschen der Datei oder des Ordners
> 
> Der Ordner "neuer Ordner" kann nicht entfernt werden: Die Datei wird von einer andeen Person bzw. einem anderen Programm verwendet.
> Schließen Sie alle Programme, die die Datei eventuell verwenden können, und wiederholen Sie den Vorgang.



Daher muss dieser Status eines Ordner/Datei prüfbar sein, aber halt nicht dirket aus Java raus.

bye Saxony


----------



## Saxony (16. Jan 2009)

So ich nochmal 

Mir kam gerade folgende Idee:

Wir überlassen einfach die Prüfung weiterhin dem OS.

Dazu folgendes Vorgehen. Den kompletten Inhalt des Ordners temporär wegspeichern. Dann den Inhalt rekursiv löschen. Danahc versuchen über File#delete den Ordner zu löschen. Dies kann eine SecurityException werfen und nebenbei liefert delete selber noch true oder false zurück.

Ließ sich also der Ordner löschen (true) dann benutzt ihn niemand/irgendwas anderes. Dann Ordner wieder Erstellen, Inhalt aus temp zurückschreiben und temp löschen. Ließ er sich nicht löschen bzw. trat schon bei der rekursiven Entfernung des Inhalts ein Fehler auf dann ist er in Verwendung. Dann den bisherigen temp Inhalt zurückschreiben und temp löschen.

Tja aber wenn du es so machst, darfst du dann auch niemanden mehr den Code zeigen.  Von der Performance sprech ich lieber gar nicht erst. *hehe*

bye Saxony


----------



## alphaChill (16. Jan 2009)

Bisher sollen nur ein paar KB-Dateien kopiert werden, daher sollte die Performance (hoffentlich) nicht allzu sehr leiden, aber mal gucken. Die Idee ansich finde ich nicht schlecht, danke 



			
				Saxony hat gesagt.:
			
		

> Tja aber wenn du es so machst, darfst du dann auch niemanden mehr den Code zeigen.


Solange mich keiner sieht, passt das schon  
Sonst kann ich immer noch behaupten, dass es deine Idee war  :lol:


----------



## Saxony (16. Jan 2009)

Was auch noch gänge wäre über JNA die Shell32.dll binden. Dann die SHELLEXECUTEINFO Struktur in Java abbilden und zum Schluss ShellExecuteEx an sich verwenden. Erklärt für ein anderes Beispiel zum Physikalischen Arbeitsspeicher ist es hier:

http://www.java-forum.org/de/topic80815_ermittlung-physikalischen-hauptspeichers.html

bye Saxony


----------

