2009-07-29 20 views
8

Sto cercando un numero moderato (~ 500) di cartelle per un numero elevato (~ 200.000) di file da un'applicazione .NET.DirectoryInfo.GetFiles lenti quando si utilizza SearchOption.AllDirectories

Spero di utilizzare DirectoryInfo.GetFiles, passando SearchOption.AllDirectories. Tuttavia questo approccio sembra essere molto più lento di scrivere il mio codice per scorrere le directory e fare GetFiles passando solo in un searchPattern.

Related MSDN info:

  • GetFiles(String)
    Restituisce un elenco di file dalla directory corrente corrispondente alla data searchPattern.
  • GetFiles(String, SearchOption)
    Restituisce un elenco di file dalla directory corrente corrispondente al searchPattern specificato e utilizza un valore per determinare se cercare le sottodirectory.

Qualcuno ha avuto un'esperienza simile a questo?

risposta

13

Queste due funzioni sono in realtà infami per le loro prestazioni. Il motivo è che GetFiles percorre l'intero albero delle directory e costruisce una serie di oggetti FileInfo e restituisce solo il risultato al chiamante. La costruzione di tale array comporta molte allocazioni di memoria (sono sicuro che utilizzino internamente lo List, poiché il numero di voci non può essere conosciuto in anticipo.

Se siete veramente in prestazioni, è possibile P/Invoke in FindFirstFile/FindNextFile/FindClose, li astratto in un FileInfo s uno IEnumerable<FileInfo> e yield alla volta.

+1

Risposta piacevole e buon esempio di utilizzo della resa. – RichardOD

1

L'approccio di Anton menzionato utilizzando FirstFirstFile() e i relativi metodi nativi è stato implementato da .NET 4 tramite DirectoryInfo.EnumerateFiles() quindi non è più necessario P/Invoke per questo!

Problemi correlati