Anfängerfrage zu Directory und GetDirectories



  • Hallo,

    ich habe mir ein Programm geschrieben das, ab eingegebenen Pfad, eine desktop.ini-Datei in jedem Ordner und Unterordner erstellt.
    Das klappt auch alles ganz gut. Nur wenn ich als Pfad z.B. C:\\ angebe, dann gibt es jedesmal wenn ich auf einen Systemordner oder den Papierkorb mit GetDirectories treffe eine Exception (Zugriffserlaubnis).

    Wie kann ich das Problem lösen?

    Kann man abfragen, ob eine Zugriffserlaubnis existiert und wenn nicht, daß man dann gegebenenfalls den aktuellen Ordnerpfad einfach verwirft?

    Wäre nett wenn mir da jemand helfen könnte

    Danke und grüße

    sub



  • Catch doch einfach die Exception und mach ein continue.



  • Ich habe mich auch schon darüber informieren müssen und habe mit erschrecken festgestellt das es in C# keine Standardroutine gibt, kann auch damit zusammen hängen das es sich zur Laufzeit ja noch ändern kann.

    Da du ja in den Ordner direkt schreiben möchtest kannst du im DirectoryInfo die Attribute checken, zb on das Verzeichnis ein Systemverzeichnis oder ReadOnly ist, dann kannst du es direkt überspringen (oder ohne Childs anzeigen).

    Aber das GetDirectories() muss trotzdem in einem Try & Catch, Es gibt auch Ordner (PerfLogs) die sind weder System, noch ReadOnly trotzdem nicht zugreifbar.

    (Der Explorer macht es so das er den Ordner dann ohne Childs anzeigt.)



  • Hallo,

    vielen Dank für eure Antworten.

    Das mit dem Exception catchen habe ich mir auch gedacht, nur weiß ich leider nicht wie ich nach der Exception weiter machen soll.
    Mit continue geht das nicht da gibt es ne Fehlermeldung.

    Das mit den Attributen hatte ich auch gelesen nur leider verstehe ich nicht so ganz wie die Abfrage auszusehen hat.

    DirectoryInfo[] dirinf = dir.GetDirectories("*", SearchOption.AllDirectories);
    

    direkt nach dieser Zeile springt er in die Exception. Also muß ich doch den Fehler wieder in der Exception abfangen, oder nicht ?
    Womit ich wieder beim Anfang wäre.
    Ich weiß nicht wie man die Exceptions so abfängt ohne daß das Programm beendet wird.

    Kann mir da jemand hlefen bitte

    danke und grüße

    sub





  • 'SearchOption.AllDirectories' kann man leider nur verwenden, wenn man Zugriff auf alle Unterordner hat. Selbst wenn man die Exception fängt, kommt man dann nicht an die weiteren (folgenden) Ordner heran.

    Die Lösung ist, selber eine rekursive Suche zu programmieren, s.z.B. http://www.mycsharp.de/wbb2/thread.php?threadid=58665



  • Hallo,

    danke für den Link, aber ich kann eine Lösung für mein Problem nicht finden.

    Firefighter schrieb:

    Catch doch einfach die Exception und mach ein continue.

    Wie geht das????

    Bitte mit Code wenn möglich. Also mit continue geht das nicht

    Grüße

    sub



  • Genau, du darfst immer nur die Childs eines Ordners holen, nicht alle auf einmal.
    Dann hast du auch die möglichkeit ein LazyLoad zu implementieren.

    Hier mal Pseudo:

    public class Folder
    {
        public string Path { get; set; }
    
        public Folder()
        { }
    
        public Folder(string path)
        {
            Path = path;
            Folders = new List<Folder>();
            var folders = Directory.GetDirectories(path);
            if (folders.Count() > 0)
                Folders.Add(new Folder());
        }
    
        public List<Folder> Folders { get; set; }
    
        public bool IsLoaded { get; set; }
    
        public bool IsOpened
        {
            get { return _isOpened; }
            set
            {
                _isOpened = value;
                if (!IsLoaded)
                {
                    Folders.Clear();
                    var folders = Directory.GetDirectories(Path);
                    foreach (var folder in folders)
                        if (DirectoryChecker.IsValidDirectory(folder))
                            Folders.Add(new Folder(folder));
                    IsLoaded = true;
                }
            }
        }
        private bool _isOpened;
    }
    
    public class DirectoryChecker
    {
        public static bool IsValidDirectory(string path)
        {
            var info = new DirectoryInfo(path);
            if (info.Attributes.HasFlag(FileAttributes.Hidden) ||
                info.Attributes.HasFlag(FileAttributes.System))
            return false;
    
            try
            {
                var security = info.GetAccessControl(System.Security.AccessControl.AccessControlSections.Access);
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
    


  • Hallo,

    vielen Dank für eure Hilfe ich habe mein Problem lösen können.

    Genau, du darfst immer nur die Childs eines Ordners holen, nicht alle auf einmal.

    Das war ein sehr guter Tipp. Ich habe mir immer eine Ebene geholt und die Attribute dann auf hidden getestet.
    Ich muß gestehen ich habe mir dazu ein Code-Schnippsel von der msdn-Seite geklaut.

    if ((dirinf.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
    

    Mit diesem funktioniert das alles einwandfrei!
    Meine Problem ist nur ich verstehe die Funktionsweise nicht so ganz.
    Könnte mir die bitte mal jemand erklären?

    danke und grüße

    sub



  • if ((dirinf.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
    

    ==

    if (dirinf.Attributes.HasFlag(FileAttributes.Hidden))
    

    FileAttribute ist ein Enumeration, enums kann man einfach durch eine Zuweisung setzen, mehrere gleichzeitig setzt man mit dem | Symbol

    Bla = First | Second;

    Nun kann man das enum prüfen ob ein Flag gesetzt ist, sei es durch den & Operator oder durch die HasFlag Methode.



  • Hallo,

    vielen Dank für deine Erklärungen.

    Den 2. Code finde ich verständlicher. Das kann ich nachvollziehen.

    Danke nochmal und grüße

    sub


Anmelden zum Antworten