Laden...

Directory auf ReadOnly prüfen

Erstellt von ayrtonsenna vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.395 Views
ayrtonsenna Themenstarter:in
27 Beiträge seit 2006
vor 17 Jahren
Directory auf ReadOnly prüfen

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?

4.506 Beiträge seit 2004
vor 17 Jahren

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!”

3.170 Beiträge seit 2006
vor 17 Jahren

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

F
722 Beiträge seit 2005
vor 17 Jahren

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.

49.485 Beiträge seit 2005
vor 17 Jahren

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

ayrtonsenna Themenstarter:in
27 Beiträge seit 2006
vor 17 Jahren

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.

49.485 Beiträge seit 2005
vor 17 Jahren

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

3.170 Beiträge seit 2006
vor 17 Jahren

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

ayrtonsenna Themenstarter:in
27 Beiträge seit 2006
vor 17 Jahren

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 😉

3.170 Beiträge seit 2006
vor 17 Jahren

Hast Du mal mit Dirctory.GetAccessControl() versucht? 😁

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

49.485 Beiträge seit 2005
vor 17 Jahren

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

3.170 Beiträge seit 2006
vor 17 Jahren

@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

4.506 Beiträge seit 2004
vor 17 Jahren

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!”