2010-02-19 9 views
11

Ho una cartella con troppi file in, e voglio passare attraverso ogni file uno per uno. Il problema è che Directory.GetFiles restituisce una matrice completata e ciò richiede troppo tempo.Have Directory.GetFiles restituisce un file alla volta? (.NET)

Preferirei avere un oggetto che indicasse una cartella, quindi chiamare una funzione che restituisce il file successivo nella cartella. .NET ha una classe come questa, per favore?

(Preferirei evitare Interops win32, come ho intenzione di usare questo su Mono pure.)

Molte grazie.

risposta

8

Non si può fare questo in .NET 3.5, ma è possibile in .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); 
} 

(. Allo stesso modo c'è un Directory.EnumerateFiles metodo statico)

non so se quell'API è stata trasferita su Mono ancora.

+0

solo una domanda, perché non utilizzare: var files = directory.EnumerateFiles(); ? –

+1

@Filip: non conosco le ragioni di Jon, ma vorrei usare il nome del tipo per chiarezza dato che non è ovvio dal nome del metodo che tipo restituisce. –

+0

@Fredrik, non è abbastanza chiaro che restituirà un elenco di informazioni di file numerabile? Il nome del metodo è davvero auto esplicativo. Lo stesso vale per DirectoryInfo, preferisco usare var directory = ... So che c'è una differenza al momento della compilazione. –

1

Dai un'occhiata al progetto FastDirectoryEnumerator sul sito Web CodeProject.

Fa esattamente quello che ti serve e anche di più, sono stato in grado di usarlo con successo su una condivisione di rete lenta con un sacco di file e le prestazioni erano semplicemente fantastiche.

Inconveniente: utilizza l'interoperabilità in modo che non possa essere trasferito su Mono.

+0

Grazie, potrei finire per usarlo, ma tornare a Directory.GetFiles se lancia un'eccezione di interoperabilità, indicando che probabilmente non sono su win32. – billpg

+1

È possibile utilizzare 'Environment.OSVersion' per determinare se si sta utilizzando Windows o meno e trovare un altro codice che funzioni rapidamente sul sistema operativo che si sta utilizzando. –