Hallo Welt,
ich möchte für ein Verzeichnis prüfen, ob es readonly ist, d.h. ob darin Dateien anlegen kann.
So probiere ich es derzeit:
DirectoryInfo di=new DirectoryInfo(sMeinPfad);
if((di.Attributes & FileAttributes.ReadOnly)==FileAttributes.ReadOnly)
{
//machwas
}
else
{
//oder was anderes
}
Leider geht er immer in den else-Zweig.
Wenn ich nun in dem Dir eine Datei anlegen will, bekomme ich eine UnauthorizedAccessException (Der Zugriff auf meinPfad wurde verweigert)
Wie kann ich das vorher prüfen?
Hallo ayrtonsenna,
ich hätte vorgeschlagen, dass Du versuchst die Datei anzulegen, und mit Try-Catch Fehler abfängst. Unter anderem kannst Du ja die "UnauthorizedAccessException" separat abfangen, und anders reagieren.
Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Versuch mal mit "try ... catch"
try
{
// versuchen, Datei anzulegen
}
catch(UnauthorizedAccessException e)
{
// Zugriff verweigert.
}
Zu spät...
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hi,
ich habe den selben effekt.
scheint wohl ein bug zu sein, denn dein code ist korrekt.
ich würde dir auch zu der exception-lösung raten, wobei das natürlich recht unschön ist.
Hallo ayrtonsenna,
ich denke auch das der Code korrekt ist. Deshalb solltest du prüfen, ob das Verzeichnis tatsächlich auf Readonly gesetzt ist. Die UnauthorizedAccessException kann man ja auch aus anderen Gründen bekommen.
herbivore
Danke für die Antworten.
Es ist wirklich etwas unschön es über die try-catch methode zu versuchen.
Ich gebe den User die Möglichkeit ein Default-Dir für seine Dateien anzugeben.
Wenn der User ein Verzeichnis gewählt hat, soll die Überprüfung auf readonly erfolgen.
Da muss ich also versuchen eine Datei anzulegen und diese dann gleich wieder löschen. Hmm.
Gibt's den keine bessere Lösung.
@herbivore
Ich habe für mein TestDir im sowohl im Win-Explorer->Eigenschaften das Häckchen "Schreibgeschützt" gesetzt und in den Sicherheitseinstellungen z.B. Schreiben und Dateien anlegen verweigert, Lesen und Ausführen sowie Ordnerinhalt auflisten erlaubt.
In dem Testdir kann ich wirklich keine Dateien schreiben.
Hallo ayrtonsenna,
dass du in das Verzeichnis nicht schreiben kannst, habe ich dir sofort geglaubt, sonst würdest du ja keine UnauthorizedAccessException bekommen. Mich wundert bloß, warum du das ReadOnly nicht auslegesen bekommst. Vielleicht hast du die Berechtigung, Attribute auszulesen, entfernt (wenn es das als separate Berechtigung überhaupt gibt). Aber im Prinzip zeigst du ja selbst, dass es mehr Wege gibt, das Schreiben zu verhinden. Es würde also nicht alleine reichen, auf ReadOnly abzufragen. Die UnauthorizedAccessException müsstest du dann so oder so noch fangen. Da hilft kein Jammern.
herbivore
So etwas sollte eigentlich jedes mal überprüft werden, wenn in das Directory geschrieben wird, die Berechtigungen können sich ja auch ändern. Dann erübrigt sich ggf. die erste Prüfung.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Das eigentliche erstellen der Datei mache ich natürlich im try-catch-Block.
Meine "Problem" liegt dort, wo ich dem Nutzer anbiete ein Default-Dir zu wählen (bei den Settings). An der Stelle möchte ich ja eigentlich keine Datei erstellen, sondern nur prüfen, ob es in dieses Dir priniziell möglich ist, Dateien zu erstellen.
Aber ich sehe schon, dass ich um den Anlegen-Löschen-Versuch nicht umhin komme 😉
Hast Du mal mit Dirctory.GetAccessControl() versucht? 😁
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hallo ayrtonsenna,
eine solche Prüfung wäre ohnehin nur von begrenztem Nutzen. Wenn erst später geschrieben wird, kann sich die Schreibbarkeit (in beiden Richtungen!) ja schon geändert haben. Ich würde die Prüfung an deiner Stelle ganz weglassen.
herbivore
@herbivore: so hatte ich das auch gemeint.
Trotzdem erstaulich, daß einem die FileAttributes hier nicht helfen. Man braucht tatsächlich das DirectorySecurity-Objekt, nicht die DirectoryInfo.
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hallo MarsStein,
unter WinXP Pro steht Dir die Wahl die erweiterte Sicherheitseinstellung zu verwenden. Standardmäßig ist es aber auf die Standardeinstellung beschränkt 🙂
In der erweiterten Einstellung (zu finden wie folgt:
Rechts-Klick auf Ordner -> Sicherheit -> Erweitert den entsprechenden Benutzer anklicken, dann gibt es die Einstellung, dass man dem entsprechenden Benutzer erlaubt die Attribute in dem entsprechenden Ordner auszulesen. Damit solltest Du die Einstellungen setzen können, und Dein Programm kann das dann auch...
Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”