Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Directory auf ReadOnly prüfen
ayrtonsenna
myCSharp.de - Member

Avatar #avatar-1918.gif


Dabei seit:
Beiträge: 27

Themenstarter:

Directory auf ReadOnly prüfen

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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!”
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
feadur
myCSharp.de - Member



Dabei seit:
Beiträge: 722
Herkunft: Bonn

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ayrtonsenna
myCSharp.de - Member

Avatar #avatar-1918.gif


Dabei seit:
Beiträge: 27

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ayrtonsenna
myCSharp.de - Member

Avatar #avatar-1918.gif


Dabei seit:
Beiträge: 27

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

Hast Du mal mit Dirctory.GetAccessControl() versucht?
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

@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
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

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!”
private Nachricht | Beiträge des Benutzers