DirectoryInfo.GetFiles, Reihenfolge der Dateien
-
Hallo,
wenn ich mit DirectoryInfo.GetFiles alle JPG Dateien eines Ordners auflisten lasse, wovon hängt dann die Reihenfolge der Dateien ab? Vom Datum oder vom Dateinamen? Wie kann man das Sortierkriterium festlegen?
Gruß
MichaelfolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyPictures; folderBrowserDialog1.ShowDialog(); DirectoryInfo myDir = new DirectoryInfo(folderBrowserDialog1.SelectedPath); FileInfo[] myFiles = myDir.GetFiles("*.jpg");
-
Verlass dich einfach nicht auf die Reihenfolge und sortiere selbst.
-
ok, das scheint der richtige Weg zu sein. Erst das Array (mit undefinierter Reihenfolge) erzeugen, und dann sortieren.
Gruß
Michael
-
Kurze Version: Ja. Es ist nicht garantiert, und daher sollte man sich auch nicht darauf verlassen. Und daher selbst sortieren.
Lange Version:
Eine naheliegende Vermutung bei Funktioen dieser Art ist immer dass sie auf die entsprechenden OS-Funktionen zurückgreifen (in diesem Fall die Win32 File/Directory APIs), und möglichst wenig selbst machen. Was auch heisst: sie sortieren nicht nachträglich nochmal irgendwie.
Wenn man wissen möchte wie die aktuelle Implementierung aussieht, dann kann man sich die auch angucken. z.B. mit Tools wie ILSpy.
Da findet man dann z.B. die Funktion
MoveNext
in der KlasseFileSystemEnumerableIterator<TSource>
. Darin befindet sich eine Schleife die die Win32 Funktion FindNextFile aufruft um den nächsten "nicht irrelevanten" Verzeichniseintrag zu finden. Dieser wird dann als nächstes "Item" verwendet.
Diese Klasse wird dann verwendet um erstmal eineList<FileInfo>
mit allen Einträgen zu erstellen, und diese List wird dann mitToArray
in ein Array verwandelt. Und das ist dann das Ergebnis vonDirectoryInfo.GetFiles
.D.h. die Reihenfolge in dem Array entspricht der in der
FindNextFile
die Ergebnisse liefert. Die Vermutung ist also soweit bestätigt.Und in der Doku zu
FindNextFile
findet man:MSDN schrieb:
The order in which the search returns the files, such as alphabetical order, is not guaranteed, and is dependent on the file system. If the data must be sorted, the application must do the ordering after obtaining all the results.
Was NTFS angeht ist es jetzt so dass die Reihenfolge normalerweise alphabetisch sortiert ist. Weil es sich durch die Datenstrukturen von NTFS so ergibt dass es keinen Mehraufwand darstellt die Einträge sortiert zurückzugeben.
Wobei "alphabetisch sortiert" auch wieder so ne Sache ist, siehe dazu z.B.
https://blogs.msdn.microsoft.com/oldnewthing/20050617-10/?p=35293/Verlassen sollte man sich aber auf keinen Fall darauf.
- Weil es von Dateisystem abhängt, und nicht jedes Laufwert mit NTFS formatiert ist
- Weil auch mit NTFS soweit ich weiss nicht garantiert ist dass das Ergebnis in jedem Fall immer 100% sortiert ist
- Weil "sortiert" relativ ist (siehe OldNewThing Link) - gibt ja verschiedene Regeln wie man Text "alphabetisch" sortieren kann
- Bzw. ganz einfach weil die offizielle Doku des .NET Frameworks eben einfach keine Garantie dazu abgibt
-
danke für die ausführliche Antwort!
Michael