2008-12-08 9 views
11

Ich muss die Anzahl der Dateien in einem Verzeichnis zählen. Ich könnte die Namen aller Dateien im Verzeichnis unter Verwendung System.IO.Directory.GetFiles() abrufen und die Länge dieses Arrays nehmen, aber das dauert zu lange auf großen Verzeichnissen. Gibt es einen Weg, um nur die Zählung zu bekommen, ohne die Namen zu bekommen?Wie finde ich heraus, wie viele Dateien sich in einem Verzeichnis befinden?

Antwort

14

Ich glaube nicht, nein - zumindest nicht in .NET. Ich vermute, dass es nicht das tatsächliche Abrufen der Namen ist, das sich die Zeit nimmt - es ist das Betriebssystem, das durch das Verzeichnis Interna geht. Dort kann ein ein Win32-Aufruf sein, den Sie über P/Invoke machen könnten.

Wie groß ist das Verzeichnis, das Sie betrachten? Im Allgemeinen ist es mindestens traditionell nicht eine gute Idee, mehr als ein paar hundert Dateien in einem Verzeichnis zu haben. Dateisysteme haben sich im Allgemeinen verbessert, aber ich weiß nicht, was der aktuelle Zustand mit NTFS und Fat32 ist.

+0

Tatsächlich hält das Dateisystem selbst nicht die Zählung. Es muss die gesamte Liste zählen, um die Anzahl zu finden - weshalb es die gleiche Zeit benötigt. – configurator

+0

Was meinst du mit Vanille .NET? – Pacerier

+1

@ Pacerier: Ich meine, ohne P/Invoke Aufrufe an eine Win32-Funktion. –

1

Bis jetzt, in den meisten Sprachen, die ich kam, erhalten Sie diese Informationen nur durch den Ordner gehen und zählen die Dateien. Ich bezweifle, dass es einen Windows-API-Aufruf gibt, um nur die Anzahl zu erhalten (aber ich kann überrascht sein!).
Vorteil des Verfahrens: Flexibilität - Sie einige Dateitypen herausfiltern können, gehen rekursiv oder Ordner ignorieren usw.

Wenn die Methode für Dich langsam ist, sollten Sie vielleicht eine bessere Methode erhalten, wie nicht zu schaffen Array gefüllt mit Verzeichnis-Informationen (braucht Zeit, um es zu füllen! Nicht zu erwähnen, Speicherkosten und Speicherbereinigung Zeit), sondern mit einem Iterator: ein bisschen mehr Arbeit (aber sobald Sie die Funktion erhalten, ist es immer da), aber viel effizienter.

7

habe ich einen kleinen Test - schrieb die gleiche Aufgabe in C++/Qt und C++/CLI:

LARGE_INTEGER i1, i2;  

QueryPerformanceCounter(&i1);  

int count = IO::Directory::GetFiles(L"c:\\windows\\system32")->Length; 

QueryPerformanceCounter(&i2); 

__int64 result = i2.QuadPart - i1.QuadPart; 

Ergebnis ist etwa 16.500.000

und

LARGE_INTEGER i1, i2; 

QueryPerformanceCounter(&i1); 

intcount = QDir("c:/windows/system32").entryList(QDir::Files).count(); 

QueryPerformanceCounter(&i2); 

__int64 result += i2.QuadPart - i1.QuadPart; 

Ergebnis ist ca. 2.100.000.000

Die Anzahl der Dateien ist 2125

+2

cool das ist gut – Pacerier

3

Es gibt keinen schnelleren Weg. Egal, was Sie verwenden, es läuft alles auf FindFirstFile und FindNextFile Win32-Aufrufe.
Sie könnten versuchen, etwas wie this, aber es wird wahrscheinlich genauso viel Zeit - aber vielleicht mit ein wenig weniger Speicherverbrauch (= wahrscheinlich nicht wert).

Verwandte Themen