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
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.
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.
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
cool das ist gut – Pacerier
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).
- 1. Matplotlib Achsenbeschriftungen: Wie finde ich heraus, wo sie sich befinden?
- 2. Viele Dateien in einem Verzeichnis?
- 3. Wie finde ich heraus, wo das Python-Include-Verzeichnis ist?
- 4. Wie finde ich heraus, wo sich Python unter Unix befindet?
- 5. Wie kann ich herausfinden, wie viele Halteklammern sich in einem Perl Regexp befinden?
- 6. Wo befinden sich die Dateien in einem leeren Repository?
- 7. benötigen viele Dateien in einem Verzeichnis kombinieren
- 8. Wie finde ich heraus, was an einem Ort ist?
- 9. Finden Sie heraus, wie viele Statusobjekte in einem Geschäft sind
- 10. Wie finde ich heraus, wo NUnit hängt?
- 11. Wie findet man heraus, ob sich zwei Entitäten in einem Datenrahmen in derselben Gruppe befinden?
- 12. Wie finde ich die älteste Datei aus einem Verzeichnis heraus ??? (PHP)
- 13. jquery - finde heraus wie viele textareas eingereicht wurden
- 14. Apache JMeter - finde heraus, wie viele Anfragen möglich sind
- 15. Wie schreibe ich ein Makefile, in dem sich die kompilierten Objektdateien in einem anderen Verzeichnis mit einem anderen Namen befinden?
- 16. Wie finde ich heraus, wo Login-Skripte leben?
- 17. Wie finde ich den aktuellen Überlaufprüfkontext heraus?
- 18. Wie finde ich heraus, was svchost macht?
- 19. Wie finde ich heraus, worauf mach_msg_trap wartet?
- 20. Wie finde ich meinen ISP heraus?
- 21. Wie finde ich Dateien in einem Java-Paket?
- 22. Wie finde ich "mein" lib Verzeichnis?
- 23. Wie finde ich heraus, von welchem Laufwerk meine Exe läuft?
- 24. Wie finde ich fehlende Dateien von einem Backup?
- 25. Wie finde ich heraus, was ich wissen muss?
- 26. Wie finde ich die aktuelle Widgetgröße in tkinter heraus?
- 27. MySQL-Kommandozeilen-Tool: Wie finde ich heraus, wie viele Zeilen von DELETE betroffen sind?
- 28. Wie finde ich heraus, welche Art von Dokument in IE
- 29. Wie finde ich heraus, welche Person maximal übernachtet hat? Name und Summe wie viele Tage?
- 30. Wie finde ich heraus, wo der Compiler seine Zeit verbringt?
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
Was meinst du mit Vanille .NET? – Pacerier
@ Pacerier: Ich meine, ohne P/Invoke Aufrufe an eine Win32-Funktion. –