2011-10-13 9 views
5

Estoy tratando de enumerar a través de archivos en mi computadora usando el siguiente código pero cada vez que golpea un archivo o directorio que no tengo permiso para leer arroja una excepción. ¿Hay alguna forma de que pueda continuar buscando después de que se haya lanzado la excepción? Sé que algunas personas han tenido problemas similares, pero ¿hay alguna otra forma de hacerlo que no sea verificar cada archivo/carpeta individualmente?Enumeración de Excepción de Lanzamiento de Archivos

try 
{ 
string[] files = Directory.GetFiles(@"C:\", "*.*",SearchOption.AllDirectories); 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 
} 
catch 
{ 
} 

Gracias por cualquier ayuda ya que esto me está volviendo loco!

Respuesta

10

Me encontré con el mismo problema hoy. Arreglé el siguiente código. Si desea utilizarlo en un producto real, es posible que necesite mejorar el manejo de errores. Como esto era para un guión único, no me importó demasiado.

static IEnumerable<string> EnumerateFilesRecursive(string root,string pattern="*") 
{ 
    var todo = new Queue<string>(); 
    todo.Enqueue(root); 
    while (todo.Count > 0) 
    { 
     string dir = todo.Dequeue(); 
     string[] subdirs = new string[0]; 
     string[] files = new string[0]; 
     try 
     { 
      subdirs = Directory.GetDirectories(dir); 
      files = Directory.GetFiles(dir, pattern); 
     } 
     catch (IOException) 
     { 
     } 
     catch (System.UnauthorizedAccessException) 
     { 
     } 

     foreach (string subdir in subdirs) 
     { 
      todo.Enqueue(subdir); 
     } 
     foreach (string filename in files) 
     { 
      yield return filename; 
     } 
    } 
} 

Para usarlo, puede:

string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

que primero se enumera todos los archivos, almacena todos los nombres de archivo en la memoria y sólo entonces los muestra. Alternativamente, usted puede:

IEnumerable<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

que escribe al enumerar y por lo tanto no es necesario para mantener todos los nombres de archivo en la memoria al mismo tiempo.

+0

Eso es genial, muchas gracias por compartir su código. No puedo encontrar la manera de hacerlo funcionar, no tengo mucha experiencia con C#. Intenté llamarlo como un método, suponiendo que la cadena de caracteres y el patrón de cadena serían args, pero no tuve suerte, solo quería enviarlo a la consola con Console.WriteLine(), ¿dónde encajo esto? ¡Gracias! –

+0

¡Ojalá pudiera darte +100! Eso funcionó perfectamente, ¡muchas gracias! –

Cuestiones relacionadas