Per il mio progetto WPF, devo calcolare la dimensione totale del file in una singola directory (che potrebbe avere sottodirectory).Perché EnumerateFiles è molto più veloce del calcolo delle dimensioni
Esempio 1
DirectoryInfo di = new DirectoryInfo(path);
var totalLength = di.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(fi => fi.Length);
if (totalLength/1000000 >= size)
return true;
Esempio 2
var sizeOfHtmlDirectory = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
long totalLength = 0;
foreach (var file in sizeOfHtmlDirectory)
{
totalLength += new FileInfo(file).Length;
if (totalLength/1000000 >= size)
return true;
}
Entrambi i campioni funzionano.
Esempio 1 completo in un tempo molto più veloce. Non l'ho cronometrato con precisione ma sul mio PC, usando la stessa cartella con lo stesso contenuto/dimensioni dei file, l'Esempio 1 richiede alcuni secondi, l'Esempio 2 richiede alcuni minuti.
EDIT
Tengo a precisare, il collo della bottiglia in Esempio 2 è all'interno del ciclo foreach! Legge rapidamente GetFiles ed entra rapidamente nel ciclo di foreach.
La mia domanda è, come faccio a scoprire perché questo è il caso?
Potrebbe essere perché con 'GetFiles' è necessario prima enumerare tutti i file prima di restituire un singolo risultato. Prova ad aggiungere un 'ToArray()' prima di '.Sum' – xanatos
E potresti anche provare' Directory.EnumerateFiles'/'DirectorInfo.GetFiles' – xanatos
Hai anche confrontato con l'approccio che usi' DirectoryInfo' come root e 'dirInfo.GetFiles' per ottenere tutti gli oggetti' FileInfo'? –