Ordner und Unterordner durchsuchen: try und catch



  • Sry, dass ich schon wieder nerve...
    Ich durchsuche einen Ordner inklusive seiner Unterordner auf Dateien.

    try
    {
      DirectoryInfo di = new DirectoryInfo("E:\\");
      foreach (FileInfo fi in di.GetFiles("*.txt", SearchOption.AllDirectories))
      {
        Console.WriteLine(fi.FullName);
      }
    }
    catch
    {
    }
    

    Mit diesem Code kommt man aber leider nicht weit, da jede Partition einen Ordner namens "$RECYCLE.BIN" hat. Der steht wegen des $ Zeichens ganz am Anfang und die ganze Aktion landet direkt im Catch-Teil, da man auf diesen Ordner keinen Zugriff hat.

    WIE SORG' ICH DAFÜR, DASS DER ORDNER EINFACH ÜBERSPRUNGEN UND DIE SUCHE FORTGESETZT WIRD? 😕 😕 😕

    PS: Man könnt natürlich den Ordner $blablabla explezit rausnehmen, aber sobald der user nen eigenen Ordner "geschützt" hat, sitzt man wieder da...

    Danke im Voraus und frohe Weihnachten, :xmas1: :xmas1: :xmas1:
    Darius.



  • Wo fliegt denn die Exception raus?

    Eine Möglichkeit wäre natürlich die Rekursion selbst zu implementieren.
    Also ohne SearchOption.AllDirectories suchen und die Unterverzeichnisse selbst behandeln.



  • hustbaer schrieb:

    Eine Möglichkeit wäre natürlich die Rekursion selbst zu implementieren.
    Also ohne SearchOption.AllDirectories suchen und die Unterverzeichnisse selbst behandeln.

    Danke für den Vorschlag... Kannst du ein Beispiel posten? Ich steig bei so längeren Sachen irgendwann nichtmehr durch... Vlt. hättest du ja dann ein par Erklärungen für mich, dass ich das hinkriege. Ich war erstmal total happy, als ich das gesehen hab im Internet, dass mit 2 zeilen oder so hinzukriegen... 😕 naja... Danke trotzdem.. 🙂



  • Das würde dann z.B. so aussehen:

    static void ListTheFuckingFiles(string directoryPath, string pattern)
    		{
    			Debug.WriteLine(string.Format("ListTheFuckingFiles(string {0})", directoryPath));
    			try
    			{
    				ListTheFuckingFiles(new DirectoryInfo(directoryPath), pattern);
    			}
    			catch (System.Exception ex)
    			{
    				Console.WriteLine("ERROR: {0}", ex.ToString());				
    			}
    		}
    
    		static void ListTheFuckingFiles(DirectoryInfo di, string pattern)
    		{
    			Debug.WriteLine(string.Format("ListTheFuckingFiles(DirectoryInfo {0})", di.FullName));
    
    			try
    			{
    				// List files in this directory
    				foreach (FileInfo fi in di.GetFiles(pattern))
    					Console.WriteLine(fi.FullName);
    
    				// Search sub-directories
    				foreach (DirectoryInfo sdi in di.GetDirectories())
    					ListTheFuckingFiles(sdi, pattern); // Function calls itself here, aka. recursion
    			}
    			catch (UnauthorizedAccessException ex)
    			{
    				Debug.WriteLine(string.Format("Cannot access '{0}' - skipping...", di.FullName));
    			}
    			catch (Exception ex)
    			{
    				Console.WriteLine("ERROR: {0}", ex.ToString());
    			}
    		}
    	}
    


  • Ah.. Danke... Cooler Methoden-Name 😉

    Allerdings müssen die beiden Methoden nicht gleich heißen, oder?

    Und was ist das für ne Sache mit {0}?
    Kann ich das so einfach für WinForms übernehmen? Den Rest krieg ich hin, das WriteLine und so, aber vlt. erklärste mir nochmal die Zahlen in den geschweiften Klammern...

    Thx,
    Darius. :xmas1:



  • #Darius# schrieb:

    Allerdings müssen die beiden Methoden nicht gleich heißen, oder?

    Nein.

    #Darius# schrieb:

    Und was ist das für ne Sache mit {0}?

    http://msdn.microsoft.com/en-us/library/txafckwd.aspx

    #Darius# schrieb:

    Kann ich das so einfach für WinForms übernehmen?

    Unwahrscheinlich.



  • Swordfish schrieb:

    #Darius# schrieb:

    Kann ich das so einfach für WinForms übernehmen?

    Unwahrscheinlich.

    Wieso? Wenn er "das WriteLine und so hinkriegt", was spricht dagegen das in einer Forms Anwendung zu verwenden?



  • #Darius# schrieb:

    Allerdings müssen die beiden Methoden nicht gleich heißen, oder?

    Nein, müssen nicht. Aber wenn sie das gleiche tun, sollten sie mMn. auch gleich heissen.



  • hustbaer schrieb:

    Swordfish schrieb:

    #Darius# schrieb:

    Kann ich das so einfach für WinForms übernehmen?

    Unwahrscheinlich.

    Wieso? Wenn [...]

    Wenn, dann schon 😉



  • Okey... Danke nochmal... Ich progge ja auch geglegentlich für Konsole, aber nichts großartiges. Eine Frage noch... Was ist Debug.Write...?

    Danke und ein Frohes Fest, (ich muss jetzt erstmal als Kamel ran beim Krippenspiel in unsrer Kirche) :xmas2: << ich weiß, das ist kein kamel, aber auch egal. 😉
    LG Darius... :xmas1:

    Edit:

    ======================

    string myName = "Fred";
    String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now);
    

    `

    Der feste Text ist "Name = " und ", hours = ". Die Formatelemente sind "{0}" mit dem Index 0 (null), was dem Objekt myName entspricht, und "{1:hh}" mit dem Index 1, was dem Objekt DateTime.Now entspricht.`

    ^^ msdn spuckt das aus... Das versteh' ich, aber was machen die beiden "h" da? Zusätzlich zu Index? Versteh ich nicht... Wieder Danke,

    Darius



  • @#Darius# : Wir sind nicht dafuer da, dir das Programmieren beizubringen. Bei konkreten Fehlern oder Fragen kannst du gerne einen Thread aufmachen, aber in meinen Augen fehlt dir Grundlagenwissen. Ich glaube es ist guenstiger wenn du doch nicht nur "gelegentlich" fuer die Konsole programmierst. Lern doch erstmal alle wichtigen Grundlagen eh du dich mit der GUI-Programmierung befasst.


  • Administrator

    #Darius# schrieb:

    Was ist Debug.Write...?

    MSDN ist dein Freund

    #Darius# schrieb:

    msdn spuckt das aus... Das versteh' ich, aber was machen die beiden "h" da? Zusätzlich zu Index? Versteh ich nicht... Wieder Danke,

    Die MSDN weiss alles...
    String.Format -> Composite Formatting -> Custom Date and Time Format Strings

    Grüssli



  • Okey.
    Ah, Danke.
    Stimmt, MSDN ist unser aller Freund. Aber n bisl unübersichtlich.
    Aber zum Glück hab ich ja euch... 😉
    Naja, nächstes Mal such ich dann einfach mal auf eigene Faust bei MSDN..

    Dankeschön und noch schöne Feiertage...


  • Administrator

    #Darius# schrieb:

    Aber n bisl unübersichtlich.

    Überhaupt nicht. Es ist immer gleich strukturiert und du hast massenhaft Links auf alles. Die Suche ist zudem sehr gut.
    Du fragst dich, was diese Formatierung bei String.Format soll. Also gehst du die MSDN Seite dort lesen. Wenn du sie sauber und vollständig durchliest, dann ergibt sich der Rest automatisch.

    Das grösste Problem ist immer, dass die Leute die Dokumentation nur schnell schnell überfliegen, statt sie korrekt und sauber zu lesen. Sich die Zeit nehmen die Dokumentation zu verstehen.

    Wenn du das machst, statt hier eine Frage zu stellen, ergeben sich für dich zwei Vorteile:
    1. Du verstehst besser, was du machst.
    2. Du bist deutlich schneller am Ziel.

    Grüssli


Anmelden zum Antworten