La mejor manera de iterar carpetas y subcarpetas


¿Cuál es la mejor manera de iterar carpetas y subcarpetas para obtener el tamaño del archivo, el número total de archivos y el tamaño total de la carpeta en cada carpeta a partir de una ubicación especificada?

Author: bluish, 2011-03-03

5 answers

Utilice el directorio .GetFiles () . La parte inferior de esa página incluye un ejemplo que es totalmente recursivo, creo.

 27
Author: Lloyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 15:57:21

Si está utilizando.NET 4, es posible que desee utilizar los métodos System.IO.DirectoryInfo.EnumerateDirectories y System.IO.DirectoryInfo.EnumerateFiles. Si utiliza el método Directory.GetFiles como otros posts han recomendado, la llamada al método no volverá hasta que haya recuperado TODAS las entradas. Esto podría tomar mucho tiempo si está usando recursión.

De la documentación :

Los métodos EnumerateFilesy GetFiles difieren de la siguiente manera:

  • Cuando utilice EnumerateFiles, puede comenzar a enumerar la colección de objetos FileInfo antes toda la colección es devolver.
  • Cuando utiliza GetFiles, debe esperar a que se devuelva toda la matriz de objetos FileInfo antes de poder acceder a la matriz.

Por lo tanto, cuando se trabaja con muchos archivos y directorios, EnumerateFiles puede ser más eficiente.

 38
Author: Chris Dunaway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 15:58:45

Para iterar a través de todos los directorios subcarpetas y archivos, no importa la cantidad de subcarpetas y archivos son.

string [] filenames;
 fname = Directory.GetFiles(jak, "*.*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();

A continuación, desde la matriz se puede obtener lo que desea a través de un bucle o como desee.

 5
Author: safi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-03 13:43:34

Tenga en cuenta que tendrá que realizar comprobaciones de validación.

string[] fileNames = Directory.GetFiles("c:\\", "*.*", SearchOption.AllDirectories);
int fileCount = fileNames.Count();
long fileSize = fileNames.Select(file => new FileInfo(file).Length).Sum(); // in bytes
 2
Author: HuBeZa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-03 13:49:26

Para iterar a través de archivos y carpetas normalmente se utilizan los tipos DirectoryInfo y FileInfo. El tipo FileInfo tiene una propiedad Length que devuelve el tamaño del archivo en bytes.

Creo que debe escribir su propio código para iterar a través de los archivos y calcular el tamaño total del archivo, pero debe ser una función recursiva bastante simple.

 1
Author: Rune Grimstad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-03 13:40:38