Was ist der Unterschied zwischen Directory.EnumerateFiles und Directory.GetFiles?

145

Was ist der Unterschied zwischen Directory.EnumerateFilesvs GetFiles?

Offensichtlich gibt einer ein Array zurück und der andere Enumerable.

Noch etwas?

Darth Vader
quelle

Antworten:

173

Aus den Dokumenten :

Die Methoden EnumerateFiles und GetFiles unterscheiden sich wie folgt: Wenn Sie EnumerateFiles verwenden, können Sie mit der Aufzählung der Namenssammlung beginnen, bevor die gesamte Sammlung zurückgegeben wird. Wenn Sie GetFiles verwenden, müssen Sie warten, bis das gesamte Array von Namen zurückgegeben wird, bevor Sie auf das Array zugreifen können. Wenn Sie mit vielen Dateien und Verzeichnissen arbeiten, kann EnumerateFiles daher effizienter sein.

Gibt also im Grunde EnumerateFileseine zurück, IEnumerabledie etwas träge ausgewertet werden kann, während GetFileseine zurückgegeben string[]wird, die vollständig ausgefüllt sein muss, bevor sie zurückkehren kann.

Daniel DiPaolo
quelle
5
Eine verzögerte Auswertung ist möglicherweise nicht völlig kostenlos - zum Beispiel, wenn Sie sie am Ende wieder in ein Array einfügen (das habe ich gesehen!). Lazy ist effizient, wenn "yagni" -all: Sie werden nicht alle Elemente benötigen und hören einfach nach ein paar auf zu iterieren.
Tomasz Gandor
5
Lazy Enumeration ist auch interessant, wenn Sie eine so große Sammlung aufzählen möchten, dass es zu schwer ist, die gesamte Sammlung zuerst im Speicher zu erstellen. Sie können die Artikel einfach so verarbeiten, wie sie kommen, und sie vergessen.
Stéphane Gourichon
1
@TomaszGandor: Oder wenn nicht alle Dateinamen gespeichert werden müssen, z. B. wenn nur Dateien umbenannt werden.
Sebastian Mach
Ich habe in den Quellen nachgesehen und festgestellt, dass beide Methoden intern sind FileSystemEnumerableFactory.CreateFileInfoIterator(). Aber EnumerateFiles()gebe diesen Iterator direkt während GetFiles()baut zusätzliche Listvon ihm und Anrufen ToArray(). Wenn Sie also Wert auf Geschwindigkeit legen, ist es sinnvoll, EnumerateFiles()den Iterator selbst zu verwenden und damit umzugehen.
C0DEF52
32

EnumerateFileskehrt zurück IEnumerable<string>und dies impliziert eine verzögerte Ausführung. Es ist nur in Fx4 und höher verfügbar.

Henk Holterman
quelle
2
Was bedeutet Fx4?
Minh Nguyen
3
.net FrameWork 4
Henk Holterman
11
Das ist ein ungewöhnlicher Name für .NET 4.0
Snak
16

Bei Verwendung von EnumerateFiles geht die gesamte Geschwindigkeit verloren, wenn Sie dann verwenden .Last. Dies ist natürlich sinnvoll, da zum Aufrufen der letzten Datei alle Dateien aufgelistet und dann die letzte abgerufen werden müssen.

Die Verwendung von .Firstoder .FirstOrDefaultwird jedoch sehr schnell, da es einfach den ersten Gegenstand ergreift und weitergeht.

Skotte
quelle
6
Diese sehr alte Frage fragte, welche Unterschiede es abgesehen vom Arrayvs- EnumerableAspekt gab. Ihre Antwort ist allgemein für alle derartigen Situationen, beantwortet jedoch nicht die gestellte Frage.
Ashigore
2
Mit EnumerateFiles können Sie in einigen Fällen schneller auf Daten zugreifen.
Skotte
16
Der Punkt ist, dass dies als Kommentar sehr nützlich ist, aber die Frage nicht beantwortet. Es wird unterschieden.
DJV