2010-02-19 9 views
11

Tengo una carpeta con demasiados archivos y quiero revisar cada archivo uno por uno. El problema es que Directory.GetFiles devuelve una matriz completa, y esto lleva demasiado tiempo.¿Han devuelto Directory.GetFiles un archivo a la vez? (.NET)

Prefiero tener un objeto que apunte a una carpeta, luego llamar a una función que me devuelve el siguiente archivo en la carpeta. ¿Tiene .NET una clase como esta, por favor?

(yo preferiría evitar Interops Win32, ya que tengo pensado utilizar esto en Mono también.)

Muchas gracias.

Respuesta

8

No se puede hacer esto en .NET 3.5, pero se puede en .NET 4.0, as per this blog post:

DirectoryInfo directory = new DirectoryInfo(@"\\share\symbols"); 
IEnumerable<FileInfo> files = directory.EnumerateFiles(); 
foreach (var file in files) { 
    Console.WriteLine("Name={0}, Length={1}", file.Name, file.Length); 
} 

(. Del mismo modo que hay un método estático Directory.EnumerateFiles)

no sé si esa API ha sido portada a Mono todavía.

+0

solo una pregunta, ¿por qué no utilizar: var files = directory.EnumerateFiles(); ? –

+1

@Filip: No sé las razones de Jon, pero usaría el nombre de tipo para mayor claridad ya que no es obvio por el nombre del método qué tipo devuelve. –

+0

@Fredrik, ¿no está suficientemente claro que va a devolver una lista de información de archivo enumerable? El nombre del método es realmente autoexplicativo. Lo mismo ocurre con DirectoryInfo, preferiría usar var directory = ... Sé que hay una diferencia en tiempo de compilación sin embargo. –

1

Eche un vistazo al proyecto FastDirectoryEnumerator en el sitio web de CodeProject.

Hace exactamente lo que necesita y aún más, pude usarlo con éxito en un uso compartido de red lento con muchos archivos y el rendimiento fue simplemente genial.

Drawback: usa interoperabilidad por lo que puede no ser portátil para Mono.

+0

Gracias, puedo terminar usando eso, pero volviendo a Directory.GetFiles si arroja una excepción de interoperabilidad, lo que indica que probablemente no esté en win32. – billpg

+1

Puede usar 'Environment.OSVersion' para determinar si se está ejecutando bajo Windows o no y buscar algún otro código que funcione rápidamente en el sistema operativo al que se dirige. –

Cuestiones relacionadas