C# Rekursive Verzeichnissuche

Sniqi

Lt. Junior Grade
Registriert
Juni 2011
Beiträge
307
Tagchen,

ich erkenn den Fehler an diesem simplen Code hier nicht.. und der ist sogar fast 1:1 von Microsoft kopiert. Es stellt eine Rekursive Verzeichnissuche dar, die mir alle .txt Dateien mit Pfad in eine ArrayList speichern soll:

Code:
    ArrayList DirSearch(string sDir)
    {
      ArrayList arraylist = new ArrayList();

      try
      {
        foreach (string d in Directory.GetDirectories(sDir))
        {
          foreach (string f in Directory.GetFiles(d, "*.txt"))
          {
            arraylist.Add(f);
          }
          DirSearch(d);
        }
      }
      catch (System.Exception excpt)
      {
        Console.WriteLine(excpt.Message);
      }


      arraylist.Sort();
      return arraylist;
    }
 
In Zeile 13 rufst du "DirSearch(d);" auf, aber benutzt den Rückgabewert garnicht. Ich denke mal, du solltest die rückgegebenen Werte ebenfalls in deine ArrayList einfügen.
 
chu_ schrieb:
Das kann auch nicht gehen, weil jedesmal die ArrayList neu erzeugt wird.

Stimmt.. und wie kann ich das verhindern/verbessern/anders machen?
Ergänzung ()

So gehts.. :stock:

Code:
    ArrayList arraylist = new ArrayList();

    ArrayList DirSearch(string sDir)
    {
           [...]
    }

Danke an alle auch wenns bisschen bekloppt war die Frage, nur manchmal aht man ne Blockade -.-
 
Zuletzt bearbeitet:
DarcRanger schrieb:
und wie kann ich das verhindern/verbessern/anders machen?
Indem du beide kombinierst. Geh die eine Liste durch und füge diese der originalen Liste hinzu (fett markiert).
Code:
static public string[] Read( string Path, string[] Pattern, bool Recursive, int MaxRecursionDepth )
{
  List<string> r = new List<string>();

  if( Recursive && MaxRecursionDepth != 0 )
  {
    int NextRecurseDepth = MaxRecursionDepth - 1;
    if( NextRecurseDepth < 0 ) NextRecurseDepth = -1;
    [B]DirectoryInfo[] Directories = new DirectoryInfo( Path ).GetDirectories();
    foreach( DirectoryInfo Directory in Directories )
      r.AddRange( Read( Directory.FullName, Pattern, Recursive, NextRecurseDepth ) );[/B]
  }

  foreach( string SinglePattern in Pattern )
  {
    FileInfo[] Files = new DirectoryInfo( Path ).GetFiles( SinglePattern );
    foreach( FileInfo File in Files )
      if( !Compare.Array.InArray( r.ToArray(), File.Extension ) )
        r.Add( File.FullName );
  }
  return r.ToArray();
}
Die Funktion nutze ich zum rekursiven auflisten.
 
Ist der Code nur zum Spaß gedacht? Ein Directory.GetFiles macht doch das gleiche.
 
@MacGyver: Musste auch gerade daran denken:
Code:
string[] files = System.IO.Directory.GetFiles("C:\\", "*.txt", System.IO.SearchOption.AllDirectories);

Aber vielleicht will er das Prinzip von Rekursionen erlernen. Man weiß es nicht.

@DarcRanger: So könntest du die Rückgabe in die ArrayList integrieren:
Code:
arraylist.AddRange(DirSearch(d));

EDIT: Und zum Schluß noch eine Variante ohne Rekursion:
Code:
    public System.Collections.ArrayList GetAllFiles(string path, string pattern)
    {
      System.Collections.ArrayList directories = new System.Collections.ArrayList(new string[] { path });
      System.Collections.ArrayList files = new System.Collections.ArrayList();
      int indx = 0;
      while (indx < directories.Count)
      {
        path = directories[indx++].ToString();
        directories.AddRange(System.IO.Directory.GetDirectories(path));
        files.AddRange(System.IO.Directory.GetFiles(path, pattern));
      }
      return files;
    }

BTW: Mir fällt nur ein Grund ein, warum man nicht die GetFiles Methode verwenden kann (zumindest bei .Net Framework 2.0). Und zwar, wenn ein Unterverzeichnis nicht geöffnet werden kann, weil man keine Rechte hat, dann schlägt sie mit einer Exception auf. Wenn man aber "von Hand" die Verzeichnisse durchläuft, kann man innerhalb der Schleife die Exception abfangen und somit ganz normal den Rest durchsuchen und die gesperrten Verzeichnisse außer Acht lassen....
 
Zuletzt bearbeitet:
1.) Man kann mit einem GetFiles Aufruf keine Exceptions abfangen

2.) Man hat eine Anweisung, die ewig braucht und dann ist alles fertig. Wenn man das über ein GUI macht, ist ein Fortschrittsbalken bzw. wenigstens so eine Anzeige, der bereits durchlaufenen Verzeichnisse nicht schlecht, damit man weiß, dass das Ding noch tut.

3.) Falls du unter Windows Vista/7 ein paar Systemordner wie Desktop, Eigene Dateien etc. durchsuchen solltest, wirst du mit dem Ansatz gröber auf die Nase fallen, da es hier einige Verzeichnisse gibt, die auf sich selbst zeigen und man dann nur in der 20. Ebene eine Exception bekommt, dass der Pfad zu lange ist. Das habe ich sehr bitter bei meinem ersten Vista Rechner feststellen müssen, als ich mein Sicherungsskript laufen lassen wollte.

Hier solltest du noch überprüfen, ob es sich um einen ReparsePoint handelt. Hier gibt es eine schöne brauchbare .dll dafür
http://www.codeproject.com/KB/vista/ReparsePointID.aspx
 
Zurück
Oben