2008-12-08 20 views
11

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

14

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.

+0

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

+0

¿qué quieres decir con vanilla .NET? – Pacerier

+1

@Pacerier: Quiero decir sin hacer llamadas P/Invoke a una función Win32. –

1

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.

7

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

+2

genial esto es bueno – Pacerier

3

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).

Cuestiones relacionadas