2012-08-16 23 views
5

¿Hay una manera rápida de cargar en la ruta completa a cada archivo (al que tiene acceso de lectura) comenzando con un directorio raíz proporcionado en decir string[]?Progreso del informe en Directory.GetFiles

vi System.IO.Directory.GetFiles, pero hay que suministrar un filtro antes de que se permite la entrada al SearchOption.AllDirectories, así que intenté:

string[] directoryList = Directory.GetFiles(RootPath, "*.*", 
              SearchOption.AllDirectories); 

Dónde RootPath es mi directorio válido, enraizada. Esto pareció funcionar bien, excepto que colgó mi aplicación de formulario de Windows durante mucho tiempo al señalar una gran estructura de directorio/archivo de 29GB y algunos cientos de miles de archivos.

así que pensé en pasándolo a través de un BackgroundWorker para que mi interfaz gráfica de usuario no parecía encerrado, pero no estoy seguro de cómo me informe de situación para algo como esto por un ProgressBar ya que es sólo una declaración de que está haciendo la carga y no tengo información sobre el número total de archivos por adelantado, o el número que ya ha procesado, etc.

Respuesta

8

Con Directory.GetFiles, siempre bloqueará hasta que todos los resultados estén completamente procesados, lo que puede llevar una mucho tiempo en una gran estructura de directorios.

Puede usar Directory.EnumerateFiles en lugar de Directory.GetFiles. Esto devuelve los resultados como IEnumerable<string> en lugar de una matriz, por lo que puede comenzar a procesar (o informar el progreso) los resultados de inmediato.

De lo contrario, la mejor opción es usar Directory.GetFiles, pero no SearchOption.AllDirectories. Luego puede usar Directory.GetDirectories para manejar la recursión y analizar los resultados en etapas.

Cuestiones relacionadas