Laden...

Die letzten 1000 Dateien aus einen Ordner einlesen

Erstellt von cacao77 vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.496 Views
C
cacao77 Themenstarter:in
6 Beiträge seit 2016
vor 7 Jahren
Die letzten 1000 Dateien aus einen Ordner einlesen

Hallo,

ich habe folgendes Problem:
In einem Ordner sind über 400.000 Dateien. Beim suchen nach bestimmten Dateien dauert es immer recht lange.
Wie kann ich das einlesen des Ordner auf die letzten 1000 erstellten Dateien ändern? Oder das suchen ?

Ornder einlesen:

DirectoryInfo Pfad = new DirectoryInfo(@"\\445.444.444.444\\ordner1\\" + Ziel_Verzeichnis);  

suchen:

 foreach (var fi in Pfad.GetFiles("*" + seriennummer + "*"))    // Protokolle anhand Seriennummer im entsprechenden Ordner suchen

Vielen Dank

MfG

Cacao

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo cacao77,

geht beispielsweise via LINQ

 DirectoryInfo path = new DirectoryInfo(@"\\445.444.444.444\\ordner1\\" + Ziel_Verzeichnis);
int count = Pfad.GetFiles().Count();
int take = 1000;
IEnumerable<FileInfo> fileInfos = Pfad.GetFiles("*" + seriennummer + "*").Skip(count - take).Take(take);

Das gibt dir die letztes 1000 Files, durchsucht aber immernoch alle.

Schreibe Variablen lieber klein und englisch 😃 . Und arbeite besser mit Path.Combine.

Gruss

Coffeebean

C
cacao77 Themenstarter:in
6 Beiträge seit 2016
vor 7 Jahren

Hallo Coffeebean,

vielen Dank für die schnelle Antwort.
Sind das dann auch die letzten 1000 erstellten Dateien ?
Es geht darum zu überprüfen ob die Datei mit der entsprechenden Seriennummer vorhanden ist.
Da interessieren mich die Dateien von vor zwei Jahren nicht mehr.

Grüße
Cacao

P
64 Beiträge seit 2011
vor 7 Jahren

Moin,

LINQ sieht zwar schön aus (keinen falschen Eindruck gewinnen, ich benutze es gerne und häfig. Wie konnte ich früher nur ohne leben) dürfte in dem Fall aber nicht schneller sein, weil es ja auch über alle Daten iterieren muss. Warscheinlich liefert es auch nicht die letzten Dateien nach Datum sondern irgend was. Die Reichenfolge ist nicht bestimmt. Du müsstes die Dateien erst mal nach Datum sortieren.

Da hilft nur Profiling. Schau dir mal an, was da so lange dauert.

Eigentlich sollte GetFiles der Zeitfresser sein und nicht das Iterieren. 400.000 Dateien sind halt kein Pappenstiel. Das kann schnon mal eine Weile dauern.

Bei so einer großem Anzahl an Dateien solltest du dir ein paar gedanken über Indexing machen. Du kannst dir ja zum Beispiel einen kleinen Dienst schreiben, der die benötigten Daten in einer Datenbank ablegt (name, datum, seriennummer). Dieser Dienst kann ja immer im Hintergrund laufen und die Datenbank ständig aktualisieren.

Mit deinem Programm fragst du dann nur noch die Datenbank ab. Das geht dann schnell.

Auf der anderen Seite kannst du dir Überlegen, ob du wirklich alle 400.000 Dateien in einem Ordner haben musst. Ich hatte auch mal viele Daten in einem Ordner (so ca 6000 Verzeichnisse). Da hat dann schon der Explorer beim Anzeigen abgekackt. Ich habe dann angefangen, die Daten in "Jahresordner" zu verschieben. Damit kann man auch schon viel Übersicht erzeugen und die Suchmenge deutlich eingranzen.

Grüße,

EDIT: Schau mal bei DirectoryInfo nach EnumerateFiles. Da kannst du schon anfangen zu durchsuchen, bevor er fertig ist, das Array zu füllen. bei GetFiles musst du warten, bis es komplett ist.

https://msdn.microsoft.com/de-de/library/dd413232(v=vs.110).aspx

Schau mal bei den Hinweisen.

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo cacao77,

Sind das dann auch die letzten 1000 erstellten Dateien ?
Es geht darum zu überprüfen ob die Datei mit der entsprechenden Seriennummer vorhanden ist.
Da interessieren mich die Dateien von vor zwei Jahren nicht mehr.

Gut, die Anforderung habe ich nicht gewusst. Du kannst das LINQ ja ausbauen:

            IEnumerable<FileInfo> fileInfos =
                path.GetFiles("...") //hole alle files mit dem Pattern
                .OrderByDescending(x => x.CreationTime) // ordne sie mir absteigend nach CreationTime
                .Take(1000); // nimm dann die ersten tausend

Kannst du ja anpassen wie du magst. Nochmal: GetFiles gibt dir ein Array zurück. Er iteriert also immernoch alle Files. Du kannst auch mit

Directory.EnumerateFiles("...").

Kurz runtergetippt:

            IEnumerable<FileInfo> enumerable = path.EnumerateFiles("...")
                .OrderByDescending(x => x.CreationTime)
                .Take(1000)
                .ToList();

arbeiten und eben LINQ drauf anwenden. Das sollte schneller sein.

Gruss

Coffeebean

3.825 Beiträge seit 2006
vor 7 Jahren

Die Verwendung von QuickIO könnte die Dateivorgänge etwas beschleunigen :

QuickIO.NET - Performante Dateioperationen

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3