Effizientere Methode, Verzeichnis, Größe
Hab ich auch schon bauen Sie eine rekursive Funktion, um das Verzeichnis, die Größe eines Ordners Weg. Es funktioniert, doch mit der wachsenden Anzahl der Verzeichnisse, die ich habe durchsuchen und die Anzahl der Dateien im jeweiligen Ordner), dies ist eine sehr langsame, ineffiziente Methode.
static string GetDirectorySize(string parentDir)
{
long totalFileSize = 0;
string[] dirFiles = Directory.GetFiles(parentDir, "*.*",
System.IO.SearchOption.AllDirectories);
foreach (string fileName in dirFiles)
{
//Use FileInfo to get length of each file.
FileInfo info = new FileInfo(fileName);
totalFileSize = totalFileSize + info.Length;
}
return String.Format(new FileSizeFormatProvider(), "{0:fs}", totalFileSize);
}
Dies ist die Suche in allen Unterverzeichnissen für das argument Weg, so dass die dirFiles
array wird ziemlich gross. Gibt es eine bessere Methode, dies zu erreichen? Ich habe gesucht, aber nicht gefunden habe, noch nichts.
Andere Idee, die mein Sinn gekommen war, setzen die Ergebnisse in einem cache, und, wenn die Funktion erneut aufgerufen wird, versuchen Sie und finden Sie die Unterschiede und nur Forschungs-Ordner, die geändert wurden. Nicht sicher, ob das eine gute Sache...
- Dies ist eine weitaus kompliziertere Frage, dann würden Sie sich vorstellen. Ich würde vorschlagen, den Aufruf in eine win32-api-Methode für so etwas.
- stackoverflow.com/q/128618/284240
- Schauen Sie durch diese parallele Lösung stackoverflow.com/questions/2979432/...
- Array-Größe ist ziemlich irrelevant, die Kosten sind zu 99,9% schlagen die Festplatte. Werden Sie zu zahlen haben, mindestens einmal, können Sie inkrementelle updates nach, die von FileSystemWatcher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind, werden Sie zuerst Scannen Sie den Baum, um eine Liste aller Dateien. Dann sind Sie Wiedereröffnung jeder Datei, um seine Größe. Dieser beläuft sich auf zweimal Scannen.
Schlage ich vor, Sie
DirectoryInfo.GetFiles
die hand, die SieFileInfo
- Objekte direkt. Diese Objekte sind vor-gefüllt mit Ihrer Länge.In .NET 4 Sie können auch die
EnumerateFiles
Methode zurückgeben wird, Sie faulIEnumable
.Versuchen
Dieser hat 700 000 Einwohner, die in 70 Sekunden auf-desktop-NICHT-RAID-P4.
So wie 10.000 einer Sekunde. Auf der server-Klasse Maschinen sollten 100.000+ /zweite einfach.
Als usr (+1), sagte EnumerateFile ist pre-gefüllt mit Länge.
Dies ist etwas kryptischer, aber es dauerte etwa 2 Sekunden für 10k Ausführungen.
Können Sie beginnen, um die Geschwindigkeit ein wenig, Ihre Funktion mit
EnumerateFiles()
stattGetFiles()
. Zumindest werden Sie nicht laden Sie die vollständige Liste in den Speicher.Wenn ' s nicht reicht, solltest du deine Funktion mehr komplexer mit threads (ein thread pro Verzeichnis ist zu viel, aber es ist nicht eine Allgemeine Regel).
Sie können eine Feste Anzahl von threads, die peeks Verzeichnisse aus einer Warteschlange, jeder thread berechnet die Größe eines Verzeichnisses und fügt der Gesamtsumme. So etwas wie:
Können Sie viel verbessern den Algorithmus spanning das durchsuchen von Verzeichnissen über alle Themen (zum Beispiel, wenn ein thread beim Parsen eines Verzeichnisses fügt Ordner für die Warteschlange). Bis Sie es komplizierter zu machen, wenn Sie sehen, es ist zu langsam (diese Aufgabe wurde von Microsoft als ein Beispiel für die neue Task Parallel Library).