Ich habe bereits eine rekursive Funktion erstellt, um die Verzeichnisgröße eines Ordnerpfads zu erhalten. Es funktioniert, aber mit der wachsenden Anzahl von Verzeichnissen, die ich durchsuchen muss (und Anzahl der Dateien in jedem entsprechenden Ordner), ist dies eine sehr langsame, ineffiziente Methode.
%Vor% Dadurch werden alle Unterverzeichnisse nach dem Argumentpfad durchsucht, so dass das dirFiles
-Array ziemlich groß wird. Gibt es eine bessere Methode, dies zu erreichen? Ich habe gesucht, aber noch nichts gefunden.
Eine andere Idee, die mir in den Sinn kam, war, die Ergebnisse in einen Zwischenspeicher zu stellen. Wenn die Funktion erneut aufgerufen wird, versuchen Sie, die Unterschiede zu finden und durchsuchen Sie nur die Ordner, die sich geändert haben. Nicht sicher, ob das auch eine gute Sache ist ...
Sie scannen zuerst den Baum, um eine Liste aller Dateien zu erhalten. Dann öffnest du jede Datei erneut, um ihre Größe zu erhalten. Dies führt zu einem doppelten Scannen.
Ich schlage vor, dass Sie DirectoryInfo.GetFiles verwenden, die Ihnen FileInfo-Objekte direkt übergeben. Diese Objekte sind mit ihrer Länge ausgefüllt.
In .NET 4 können Sie auch die EnumerateFiles-Methode verwenden, die Ihnen ein faules IEnumable zurückgibt.
Mit EnumerateFiles()
anstelle von GetFiles()
kannst du deine Funktion etwas beschleunigen. Zumindest werden Sie nicht die vollständige Liste im Speicher laden.
Wenn es nicht genug ist, sollten Sie Ihre Funktion more komplex mit Threads machen (ein Thread pro Verzeichnis ist zu viel, aber es gibt keine allgemeine Regel).
Sie können eine feste Anzahl von Threads verwenden, die Verzeichnisse aus einer Warteschlange durchsuchen, jeder Thread berechnet die Größe eines Verzeichnisses und addiert zur Gesamtsumme. Etwas wie:
Sie können den Algorithmus, der die Suche von Verzeichnissen über alle Threads umfasst, erheblich verbessern (wenn ein Thread beispielsweise ein Verzeichnis analysiert, fügt er der Warteschlange Ordner hinzu). Es ist Ihnen überlassen, es komplizierter zu machen, wenn Sie sehen, dass es zu langsam ist (diese Aufgabe wurde von Microsoft als Beispiel für das neue Aufgabe parallele Bibliothek ).