Ich versuche, die Verzeichnisgrößen so zu berechnen, dass die Last geteilt wird, sodass der Benutzer den Fortschritt der Zählung sehen kann. Ich dachte, eine logische Möglichkeit wäre, zuerst die Verzeichnisstruktur zu erstellen und dann eine Operation auszuführen, die die Länge aller Dateien zählt.Berechnen von Verzeichnisgrößen
Die Sache, die mir als unerwartet kommt ist, dass der Großteil der Zeit (Disk I/O) kommt von der Erstellung der Verzeichnisbaum, dann über die FileInfo[]
kommt fast sofort mit praktisch keine Festplatte I/O.
Ich habe versucht mit beiden Directory.GetDirectories()
, einfach erstellen einen Baum von Strings der Verzeichnisnamen und mit einem DirectoryInfo
Objekt, und beide Methoden noch immer den Großteil der E/A-Zeit (Lesen der MFT natürlich) verglichen über alle FileInfo.Length
für die Dateien in jedem Verzeichnis gehen.
Ich denke, es gibt keine Möglichkeit, die I/O zu reduzieren, um den Baum signifikant zu machen, ich denke ich frage mich nur, warum diese Operation wesentlich mehr Zeit benötigt im Vergleich zu den zahlreicheren Dateien?
Auch wenn jemand eine nicht-rekursive Möglichkeit empfehlen könnte, die Dinge zu vergleichen (da es scheint, muss ich die Aufzählung einfach aufteilen und ausgleichen, um die Größe tallying reaktionsfähiger zu machen). Einen Thread für jedes Unterverzeichnis von der Basis zu erstellen und den Scheduler-Wettbewerb auszubalancieren, wäre wahrscheinlich nicht sehr gut, oder?
EDIT: Repository for this code
Ich habe auch mit der Berechnung der Verzeichnisgröße gekämpft. Ich habe genau das gemacht, was du getan hast. Versucht> fileInfo [] und dann> Directory.GetDirectories(). Aber ich weiß immer noch keinen besseren Weg. –
Sie sagen, dass der Aufruf von GetDirectories() lange dauert? Ich habe das nicht gesehen, aber andererseits habe ich das nie mit einer großen Anzahl von Verzeichnissen gemacht. Auch warum würde es dich interessieren, ob es rekursiv ist? Dies ist eine rekursive Aufgabe, und Sie werden nie so viele verschachtelte Verzeichnisse haben, dass Sie einen Stapel blasen werden. –
siehe http://stackoverflow.com/questions/468119/whats-the-best-way-to-calculate-the-size-of-a-directory-in-net –