Necesito obtener un recuento de la cantidad de archivos en un directorio. Pude obtener los nombres de todos los archivos en el directorio usando System.IO.Directory.GetFiles()
y tomar la longitud de esa matriz, pero eso lleva demasiado tiempo en directorios grandes. ¿Hay alguna manera de obtener solo el conteo sin tener que obtener los nombres?¿Cómo puedo saber cuántos archivos hay en un directorio?
Respuesta
No lo creo, no, al menos no en vanilla .NET. Sospecho que no es la obtención real de los nombres lo que lleva tiempo: es el sistema operativo que recorre el interior del directorio. Hay puede ser una llamada de Win32 que podría hacer a través de P/Invoke.
¿Qué tamaño tiene el directorio que está buscando? En general, al menos tradicionalmente no ha sido una buena idea tener más de unos cientos de archivos en un directorio. Los sistemas de archivos han mejorado en esto en general, pero no sé cuál es el estado actual con NTFS y Fat32.
Hasta ahora, en la mayoría de los idiomas que encontré, se obtiene esta información solo caminando la carpeta y contando los archivos. Dudo que haya una llamada a la API de Windows para obtener solo el conteo (¡pero puedo sorprenderme!).
ventaja del método: la flexibilidad - se puede filtrar algunos tipos de archivos, bajar de forma recursiva o ignorar las carpetas, etc.
Si el método es lento para usted, tal vez debería obtener un mejor método, como no crear una array lleno de información de directorio (¡lleva tiempo llenarlo! sin mencionar el costo de memoria y el tiempo de recolección de basura) pero usando un iterador: un poco más de trabajo (pero una vez que obtienes la función, siempre está ahí) pero mucho más eficiente.
hice una pequeña prueba - escribió la misma tarea en C++/Qt y C++/CLI:
LARGE_INTEGER i1, i2;
QueryPerformanceCounter(&i1);
int count = IO::Directory::GetFiles(L"c:\\windows\\system32")->Length;
QueryPerformanceCounter(&i2);
__int64 result = i2.QuadPart - i1.QuadPart;
El resultado es de aproximadamente 16.500.000
y
LARGE_INTEGER i1, i2;
QueryPerformanceCounter(&i1);
intcount = QDir("c:/windows/system32").entryList(QDir::Files).count();
QueryPerformanceCounter(&i2);
__int64 result += i2.QuadPart - i1.QuadPart;
resultado es aproximadamente 2.100.000.000
El número de archivos es 2125
genial esto es bueno – Pacerier
No hay forma más rápida. No importa lo que use, todo se reduce a FindFirstFile
y FindNextFile
llamadas a Win32.
Puede intentar usar algo como this, pero probablemente demore tanto tiempo, pero quizás con un poco menos de uso de memoria (= probablemente no valga la pena).
- 1. Cómo saber cuántos oyentes de eventos hay en la página
- 2. JQuery: ¿Cómo saber cuántos hijos tiene un elemento?
- 3. ¿Cómo puedo saber qué hay en un tablespace Postgresql?
- 4. ¿Cómo puedo recuperar de manera eficiente la cantidad de archivos en un directorio?
- 5. ¿Cómo puedo recorrer archivos en un directorio en Perl?
- 6. ¿Cuántos bits hay en un personaje?
- 7. ¿Cómo puedo iterar sobre archivos en un directorio determinado?
- 8. ¿Es posible saber cuántos clientes suscribieron un "canal" en redis?
- 9. ¿Cuántos archivos en un directorio son demasiados (en Windows y Linux)?
- 10. ¿Cómo puedo controlar un directorio para los archivos recién cargados?
- 11. ¿Cómo atravesar los archivos en un directorio?
- 12. Android: ¿Cómo puedo saber cuántos textos pueden caber en mi textView (mi página)?
- 13. ¿Cuántos archivos puede guardar con seguridad un directorio de Windows Server 2008 r2?
- 14. ¿Cómo puedo saber qué hay en los objetos no liberados?
- 15. cómo puedo saber cuántos objetos son creados de una clase en C#
- 16. Muchos archivos en un directorio?
- 17. ¿Cómo puedo eliminar archivos en un directorio que se copian de otro directorio?
- 18. ¿Cómo puedo saber si una ruta determinada es un directorio o un archivo? (C/C++)
- 19. ¿Cuántos hilos hay en mi método?
- 20. ¿Cómo puedo saber si un archivo es descendiente de un directorio determinado?
- 21. Copia de archivos desde un directorio en un directorio existente
- 22. CLLocationCoordinate2D sin saber cuántos habrá en la matriz?
- 23. ¿Cómo puedo saber si un archivo está en un sistema de archivos remoto con Perl?
- 24. ¿Cuántos píxeles hay en 1em en IE8?
- 25. ¿Cómo puedo saber que un directorio es la papelera de reciclaje en C#?
- 26. cuántos contactos hay en la lista de contactos
- 27. ¿Cómo puedo comprimir un directorio con .NET?
- 28. ¿Cuántos dígitos hay en esta base?
- 29. ¿Cómo puedo saber de qué directorio proviene una biblioteca importada en python?
- 30. ¿Cuántos estilos de escritura hay en C?
De hecho, el sistema de archivos en sí no mantiene el recuento. Debe contar toda la lista para encontrar el recuento, por lo que requiere el mismo tiempo. – configurator
¿qué quieres decir con vanilla .NET? – Pacerier
@Pacerier: Quiero decir sin hacer llamadas P/Invoke a una función Win32. –