¿Cómo enumerar recursivamente todos los archivos en un directorio en C#?
¿Cómo enumerar recursivamente todos los archivos en un directorio y directorios secundarios en C#?
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];
}
}
}
}
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);
}
}