Ich weiss nicht was ich falsch mache aber wenn ich auf Windows (XP oder Vista) nach den Schreibrechten einer Datei frage erhalte ich immer true zurück (ausser die Datei existiert gar nicht).
Ich habs vorerst so gelöst dass wenn es Windows ist die zu testende Datei umbenannt wird, und dann wieder zurück umgenannt wird. wenn das geht habe ich wohl schreibrechte sonst nicht. Aber das muss doch besser gehen.
Das Javadoc sagt ja zu File#canWrite() folgendes:
"Tests whether the application can modify the file denoted by this abstract pathname."
Wieso erhalte ich dann true als Antwort wenn das dann doch nicht geht.
Das Problem besteht vor allem dann wenn ein Admin eine Datei erstellt (zB bei Installation des Programms) und dann ein normaler User diese Datei überschreiben will (z.B. Programmupdate).
Und wie ist das bei Vista? Da kann man ja die ungeheuerlichsten Sachen machen und Vista versucht dann die Datei an einer anderen Stelle zu speichern und tut nur so als sei die Datei da. Ich will aber wissen ob ich da nun wirklich Schreibrechte habe.
File.canWrite() prüft ob das Attribute "Schreibgeschützt" an der Datei gesetzt ist!
Aber File.canWrite() prüft nicht Benutzerberechtigung wie admin darf aber Benutzer xyz darf nicht!
gruß
Ich hab halt die blöde Angewohnheit erst mal im Handbuch zu lesen:
* Returns the number of bytes available to this virtual machine on the
* partition <a href="#partName">named</a> by this abstract pathname. When
* possible, this method checks for write permissions and other operating
* system restrictions and will therefore usually provide a more accurate
* estimate of how much new data can actually be written than {@link
* #getFreeSpace}. [meine Hervorhebung]
Wenn diese Funktion mir sagen würde ob und wieviel ich schreiben darf wäre das durchaus nützlich. Oder auch nicht, ich weiss jetzt auch nicht, ich will doch einfach nur wissen ob ich Schreibrechte habe oder nicht.
Na gut, ich kann einen machen, ich meinte eigentlich System.getSecurityManager(), der war halt null. Aber egal, denn das macht nichts anderes als AccessController.checkPermission() ausführen und das geht wie gesagt nicht.
Es sagt ich habe keine Schreibrechte aber wenn ich schreibe geht's dann doch.
Zumindest hier auf Windows 2000, wo ich das gerade teste. Es soll dann auf 2k,XP und Vista gehen.
Auf Unix hatte es ja bisher mit canWrite() funktioniert, zumindest dachte ich das, wobei ich das auch nochmals genauer testen sollte.
Mir scheint dass ich nicht drum rum komme eine Datei umzubenennen um zu sehen was passiert und dann auf Grund dessen zu entscheiden ob ich da Schreibrechte habe oder nicht. Das dürfte auch auf allen Systemen funktionieren.
Ich will halt nicht dem Benutzer sagen es gäbe ein Update fürs mein Programm und dann geht es doch nicht weil die Schreibrechte fehlen.
Ich hab halt die blöde Angewohnheit erst mal im Handbuch zu lesen:
* Returns the number of bytes available to this virtual machine on the
* partition <a href="#partName">named</a> by this abstract pathname. When
* possible, this method checks for write permissions and other operating
* system restrictions and will therefore usually provide a more accurate
* estimate of how much new data can actually be written than {@link
* #getFreeSpace}. [meine Hervorhebung]
Wenn diese Funktion mir sagen würde ob und wieviel ich schreiben darf wäre das durchaus nützlich. Oder auch nicht, ich weiss jetzt auch nicht, ich will doch einfach nur wissen ob ich Schreibrechte habe oder nicht.
Oder sogar nur ob der Mountpoint auf dem der Ordner sich befindet beschreibbar ist. Bei einer Floppy-Disk wäre es der Schreibschutz vom Medium. Vielleicht kommt es noch daher.