2011-07-07 12 views
14

aquí es mi código:¿Cómo puedo realizar un análisis recursivo y de archivos completo?

private static void TreeScan(string sDir) 
    { 
     foreach (string d in Directory.GetDirectories(sDir)) 
     { 
      foreach (string f in Directory.GetFiles(d)) 
      { 
       //Save file f 
      } 
     } 
     TreeScan(d, client); 
    } 

El problema es que no recibe la ARCHIVOS del SDIR(directorio inicial) sólo se pone las carpetas y los archivos de las subcarpetas .

¿Cómo puedo hacer que obtenga los archivos del sDir también?

Respuesta

8
private static void TreeScan(string sDir) 
{ 
    foreach (string f in Directory.GetFiles(sDir)) 
    { 
     //Save f :) 
    } 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
     TreeScan(d); 
    } 
} 
1

Usted tiene que usar

Directory.GetFiles(targetDirectory); 

como en This sample, cosa que contiene una implementación completa de lo que está buscando

44

No reinventar la rueda, utilice la sobrecarga de GetFiles que le permite especificar que busque subdirectorios.

string[] files 
    = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories); 
+2

Finalmente alguien con cierto sentido. –

+1

Sí, pero la recursión falla al protegerse primero con una carpeta System.UnauthorizedAccessException. – MuiBienCarlota

+0

si no necesita un patrón de búsqueda, puede usar un asterisco (*) para que el patrón de búsqueda devuelva todos los directorios –

2

Existen algunos problemas con el código. Por un lado, la razón por la que nunca vio los archivos desde la carpeta raíz es porque recursó antes de hacer y lee archivos. Pruebe esto:

public static void Main() 
{ 
    TreeScan(@"C:\someFolder"); 
} 

private static void TreeScan(string sDir) 
{ 
    foreach (string f in Directory.GetFiles(sDir)) 
     Console.WriteLine("File: " + f); // or some other file processing 

    foreach (string d in Directory.GetDirectories(sDir)) 
     TreeScan(d); // recursive call to get files of directory 
} 
0

Su bucle GetFiles debe estar fuera del bucle GetDirectories. ¿Y su TreeScan no debería permanecer dentro de GetDirectories? En resumen, el código debería tener este aspecto:

private static void TreeScan(string sDir) 
{ 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
     TreeScan(d, client); 
    } 
    foreach (string f in Directory.GetFiles(d)) 
    { 
     //Save file f 
    } 
} 
0

Si se utiliza Fx4 y sobre el método EnumerateFiles devolverá todos los archivos con la gestión eficiente de la memoria, mientras que GetFiles puede requerir recursos máximos en grandes directorios (o unidades).

var files = Directory.EnumerateFiles(dir.Path, "*.*"); 
Cuestiones relacionadas