Directory.EnumerateFiles Leseauftrag (C #)

8

Was ist die Standard-Leserichtung für die Methode Directory.EnumerateFiles ? Ist es konsistent?

Nach meiner Erfahrung scheint es bis zum Datum der Erstellung der Dateien zu sein, aber ich konnte keine Bestätigung dafür finden.

Grund, den ich stelle, ist, weil ein Teil eines Programms, an dem ich arbeite, Binärdateien aus Verzeichnissen in Objekte lädt, die wiederum in Arrays geladen werden. Diese Objekte verweisen untereinander auf Arrays von Indizes, was bedeutet, dass die Reihenfolge, in der sie in ihre Arrays geladen werden, konsistent bleiben muss (um Indexverschiebungen zu vermeiden).

Während ich hier bin, habe ich noch eine andere kleine Frage. Wenn Dateien gelöscht werden, ändert es offensichtlich die Indizes der Dateien, die in Arrays geladen werden, egal was ich mache. Irgendwelche Vorschläge, um dieses Problem zu vermeiden? Ich habe es bisher vermieden, ein Wörterbuch zu benutzen, weil ich mir Gedanken über den Speicher mache (ich würde lieber keine Arrays von Textschlüsseln speichern, wenn ich es vermeiden könnte), aber wenn es der einzig mögliche Ansatz ist, muss ich es trotzdem implementieren.

>

BEARBEITEN: Nach den ausgezeichneten Tipps aus Ihren Antworten habe ich einen Wörterbuchansatz mit den Namen der Dateien überarbeitet. Die Auswirkungen auf die Leistung waren ziemlich vernachlässigbar, und die Lesbarkeit und Wartbarkeit sind beide erheblich verbessert, so dass es ziemlich gut funktioniert hat.

    
Djentleman 31.12.2012, 03:58
quelle

3 Antworten

10

Soweit ich das beurteilen kann, ist es nicht dokumentiert - also selbst wenn Sie ein Muster erkennen können, sollten Sie sich nicht darauf verlassen. Dies kann von der Version von .NET oder der Version des Betriebssystems abhängen oder einfach zwischen Service Packs wechseln. Wenn Sie eine bestimmte Reihenfolge benötigen, sollten Sie sie stattdessen selbst sortieren. Das erfordert natürlich leider, alle Dateinamen vor der Verarbeitung zu finden, aber es wird Ihnen Konsistenz geben.

Um ehrlich zu sein, es klingt jedoch so, als hätten Sie ein sehr fragiles Datenmodell. Sie haben uns nicht wirklich genug darüber erzählt, was Sie tun, um es zu beheben, aber die Verwendung des ganzzahligen Indexes einer Datei innerhalb der Ergebnisse von Directory.EnumerateFiles ist sicher nicht der beste Ansatz.

>

Wenn Sie anstelle des Indexes die Datei name verwendet haben, können Sie möglicherweise Dateien so verarbeiten, wie Sie sie lesen, aber möglicherweise gibt es sogar noch bessere Ansätze, je nachdem, was Sie sind versuchen zu tun. Die Verwendung des Namens sollte immer noch recht billig sein - es wird nur eine einzelne String-Referenz anstelle einer Ganzzahl sein, und selbst wenn sie an mehreren Stellen verwendet wird, sind es mehrere Referenzen auf das gleiche String-Objekt.

    
Jon Skeet 31.12.2012, 04:02
quelle
13

Die von .NET verwendete Win32-API ist FindFirstFile und FindNextFile . Die Dokumentation enthält ausdrücklich :

  

Die Reihenfolge, in der diese Funktion die Dateinamen zurückgibt, hängt vom Dateisystemtyp ab. Bei den NTFS-Dateisystem- und CDFS-Dateisystemen werden die Namen normalerweise in alphabetischer Reihenfolge zurückgegeben. Bei FAT-Dateisystemen werden die Namen normalerweise in der Reihenfolge zurückgegeben, in der die Dateien auf die Festplatte geschrieben wurden, möglicherweise in alphabetischer Reihenfolge. Wie bereits erwähnt, sind diese Verhaltensweisen jedoch nicht garantiert.

Nein, Sie können nicht garantieren, dass die Dateien zurückgegeben werden. Die anderen Antworten bieten ausreichende Möglichkeiten, dieses Verhalten zu umgehen.

    
vcsjones 31.12.2012 04:11
quelle
4

In der Dokumentation wird die Reihenfolge nicht angegeben, Sie können jedoch jederzeit die gewünschte Reihenfolge erzwingen, indem Sie die Funktion OrderBy von LINQ verwenden.

Sie können Indexänderungen überspringen, indem Sie Verweise auf null löschen, anstatt die Elemente tatsächlich aus dem Array zu entfernen. Der Kompromiss hier ist, dass Sie jetzt überprüfen müssen, ob das Element am angegebenen Index null ist.

Wenn Sie eine besser lesbare Datenstruktur im Hinterkopf haben, die auf Dictionary basiert, sollten Sie darauf ausweichen und die Effizienzprobleme ignorieren, bis Ihr Profiler Ihnen sagt, dass Sie diesen bestimmten Teil Ihres Codes optimieren müssen.

    
dasblinkenlight 31.12.2012 04:06
quelle

Tags und Links