2010-08-27 6 views
6

Tengo directorios masivos, y me gustaría leer todos los archivos lo más rápido que pueda. Quiero decir, no DirectoryInfo.GetFiles rápido, pero 'get-clusters-from-disk-low-level' rápido.* FASTEST * directory listing

Por supuesto, .NET 2.0, C#

pregunta Similar fue aquí, pero este enfoque no fue nada bueno:

C# Directory listing massive directory

Alguien sugirió PInvoke en FindFirst/FindNext. ¿Alguien lo intentó y puede compartir los resultados?

+0

Usando reflector parece que DirectoryInfo.GetFiles en última instancia se reduce a llamadas FindFirstFile/FindNextFile kernel32 de todos modos. –

Respuesta

5

Para un enfoque "normal", básicamente todo se reduce a FindFirstFile/FindNextFile, realmente no se obtiene mucho más rápido que eso ... y eso no es súper turbo-rápido.

Si realmente velocidad de la necesidad, mira en la lectura de la MFT manualmente - pero sabe que esto requiere privilegios de administrador, y es propenso a romper cada vez que se actualiza NTFS (y, oh sí, no funcionará para no NTFS sistemas de archivos). Es posible que desee echar un vistazo a this code que tiene USN y cosas de MFT.

Sin embargo, tal vez hay una solución diferente. Si su aplicación se ejecuta constantemente y necesita recoger los cambios, puede comenzar haciendo un pase lento FindFirstFile/FindNextFile, y luego usar el soporte de notificación de cambio de directorio para estar informado de las actualizaciones ... que funciona para usuarios limitados, y doesn ' Depende de las estructuras del sistema de archivos.

1

Intenta usar algo como this DirectoryManager y refínalo según tus necesidades. Funciona más rápido que .NET Framework GetDirectories() o GetFiles() porque omitimos allí las comprobaciones y adaptaciones multiplataforma.

+2

Muy buena clase pequeña, usa 'FindFirstFile/FindNextFile'. Personalmente, agregaría una copia del código aquí en lugar de vincularlo a otro sitio, solo en caso de que se caiga. – Thymine

+5

@Eugene Cheverda El enlace de DirectoryManager ya no funciona: P –

3

Para un mejor rendimiento, es posible P/Invoke NtQueryDirectoryFile, documentado como ZwQueryDirectoryFile.

(Eso corta de acceso al disco directamente y la lectura de las estructuras del sistema de archivos en bruto directamente, lo que por lo general no es práctico.)