405 Stimmen

Wie rekursiv Liste alle Dateien in einem Verzeichnis in C#?

Wie rekursiv Liste alle Dateien in einem Verzeichnis und untergeordneten Verzeichnissen in C#?

534voto

Marc Gravell Punkte 970173

Beachten Sie, dass in .NET 4.0 (angeblich) Iterator-basierte (und nicht Array-basierte) Dateifunktionen eingebaut sind:

foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
{
    Console.WriteLine(file);
}

Im Moment würde ich etwas wie unten verwenden; die eingebaute rekursive Methode bricht zu leicht ab, wenn Sie keinen Zugriff auf ein einzelnes Unterverzeichnis haben...; die Queue<string> Verwendung vermeidet zu viel Call-Stack-Rekursion, und der Iterator-Block verhindert, dass wir ein riesiges Array haben.

static void Main() {
    foreach (string file in GetFiles(SOME_PATH)) {
        Console.WriteLine(file);
    }
}

static IEnumerable<string> GetFiles(string path) {
    Queue<string> queue = new Queue<string>();
    queue.Enqueue(path);
    while (queue.Count > 0) {
        path = queue.Dequeue();
        try {
            foreach (string subDir in Directory.GetDirectories(path)) {
                queue.Enqueue(subDir);
            }
        }
        catch(Exception ex) {
            Console.Error.WriteLine(ex);
        }
        string[] files = null;
        try {
            files = Directory.GetFiles(path);
        }
        catch (Exception ex) {
            Console.Error.WriteLine(ex);
        }
        if (files != null) {
            for(int i = 0 ; i < files.Length ; i++) {
                yield return files[i];
            }
        }
    }
}

229voto

John T Punkte 23177

Dieser Artikel deckt alles ab, was Sie brauchen. Aber anstatt die Dateien zu durchsuchen und die Namen zu vergleichen, drucken Sie einfach die Namen aus.

Sie kann wie folgt geändert werden:

static void DirSearch(string sDir)
{
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                Console.WriteLine(f);
            }
            DirSearch(d);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

Hinzugefügt von barlop

GONeale erwähnt, dass die obige Methode nicht die Dateien im aktuellen Verzeichnis auflistet und schlägt vor, den Teil, der die Dateien auflistet, außerhalb des Teils zu platzieren, der die Verzeichnisse auflistet. Das Folgende würde das tun. Es enthält auch eine Writeline-Zeile, die Sie auskommentieren können, um zu verfolgen, wo Sie sich in der Rekursion befinden, was helfen kann, die Aufrufe zu zeigen, um zu zeigen, wie die Rekursion funktioniert.

            DirSearch_ex3("c:\\aaa");
            static void DirSearch_ex3(string sDir)
            {
                //Console.WriteLine("DirSearch..(" + sDir + ")");
                try
                {
                    Console.WriteLine(sDir);

                    foreach (string f in Directory.GetFiles(sDir))
                    {
                        Console.WriteLine(f);
                    }

                    foreach (string d in Directory.GetDirectories(sDir))
                    {
                        DirSearch_ex3(d);
                    }
                }
                catch (System.Exception excpt)
                {
                    Console.WriteLine(excpt.Message);
                }
            }

163voto

Pescuma Punkte 1814
Directory.GetFiles("C:\\", "*.*", SearchOption.AllDirectories)

26voto

Kürzester Rekord

string[] files = Directory.GetFiles(@"your_path", "*.jpg", SearchOption.AllDirectories);

16voto

John Kaster Punkte 2433

Zumindest in .NET 4.5 gibt es diese Version, die viel kürzer ist und den zusätzlichen Vorteil hat, dass sie alle Dateikriterien für die Aufnahme in die Liste auswertet:

public static IEnumerable<string> GetAllFiles(string path, 
                                              Func<FileInfo, bool> checkFile = null)
{
    string mask = Path.GetFileName(path);
    if (string.IsNullOrEmpty(mask)) mask = "*.*";
    path = Path.GetDirectoryName(path);
    string[] files = Directory.GetFiles(path, mask, SearchOption.AllDirectories);

    foreach (string file in files)
    {
        if (checkFile == null || checkFile(new FileInfo(file)))
            yield return file;
    }
}

So verwenden:

var list = GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X