¿Cómo enumerar recursivamente todos los archivos en un directorio en C#?

Resuelto asked hace 15 años • 24 respuestas

¿Cómo enumerar recursivamente todos los archivos en un directorio y directorios secundarios en C#?

 avatar May 30 '09 14:05
Aceptado

Tenga en cuenta que en .NET 4.0 hay (supuestamente) funciones de archivo integradas basadas en iteradores (en lugar de basadas en matrices):

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

Por el momento usaría algo como a continuación; el método recursivo incorporado se rompe con demasiada facilidad si no tienes acceso a un único subdirectorio...; el Queue<string>uso evita demasiada recursividad en la pila de llamadas y el bloque iterador evita que tengamos una matriz enorme.

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];
            }
        }
    }
}
Marc Gravell avatar May 30 '2009 09:05 Marc Gravell

Este artículo cubre todo lo que necesitas. Excepto que, en lugar de buscar archivos y comparar nombres, simplemente imprima los nombres.

Se puede modificar así:

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);
    }
}

Añadido por

GONeale menciona que lo anterior no enumera los archivos en el directorio actual y sugiere colocar la parte que enumera los archivos fuera de la parte que obtiene los directorios. Lo siguiente haría eso. También incluye una línea Writeline que puede descomentar, que ayuda a rastrear dónde se encuentra en la recursividad y que puede ayudar a mostrar las llamadas para ayudar a mostrar cómo funciona la recursividad.

            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);
                }
            }
 avatar May 30 '2009 07:05