Mittlerweile habe ich es hinbekommen meine Verzeichnisse über mehrere Tasks suchen und ausgeben zu lassen.
In PesentFiles() kann ich dann später meine Dateien in eine Datenbank schreiben und dort weiterverarbeiten.
Das wird dann der nächste Schritt, das gleichzeitige schreiben in eine
DB.
Wobei die Tasks ja über Queue gesteuert sind und dadurch eigentlich nacheinander abgearbeitet weren sollten ???
Mal sehen ob das so funktioniert.
Zu dieser Version habe ich aber noch 3 Fragen:
1. Wie mache ich es am besten in der Predicate Function wenn ich zusätzlich noch 2 Strings ausfiltern will z.B. 'xy.tmp' und '*.xxx', ohne gleich mit Regex zu arbeiten, wie ich bei Sir Rufo gesehen habe, das ist mir zu unübersichtlich und kostet ja auch zusätzlich Zeit.
2. Das WaitForAll habe ich hier denke ich richtig eingesetzt und trotzdem kommt immer die 'Array ist nil' Meldung. Ist zwar nicht wichtig, wollte aber mal wissen was hier falsch läuft.
3. Das ganze in eine Klasse einbauen, an die man nur noch das Suchverzeichnis und die include/exclude Maske übergibt. PresentFiles als Procedure, die man selbst dann anpassen kann.
Hier ein Stück Code für Problem 1 und 2
Delphi-Quellcode:
Predicate := function(const Path: string; const SearchRec: TSearchRec): Boolean
begin
Result := (SearchRec.Attr and faHidden)=0;
end;
// Haupt Verzeichnisse einlesen
MainVerz := TDirectory.GetDirectories(StartFolder, TSearchOption.soTopDirectoryOnly, nil);
// Task Anzahl auf Anzahl der verzeichnisse setzen
SetLength(LTasks, High(MainVerz)+1);
// dann die Dateien im Hauptverzeichnis auflisten
FFiles := TDirectory.GetFiles(StartFolder, SuchMaske, TSearchOption.soTopDirectoryOnly, Predicate);
If High(FFiles)>0 Then PresentFiles(FFiles);
ProgressBar1.Max := High(MainVerz);
// dann alle Dateien in allen Unterverzeichnissen auflisten
for I := 0 to High(MainVerz) do
Begin
Verz := MainVerz[I];
LTasks[TaskCounter] := Form1.ListDir(Verz);
Application.ProcessMessages;
ProgressBar1.Position := TaskCounter;
Application.ProcessMessages;
End;
// Schleife zuende dann warten bis alle Threads Beendet sind um die Zeit zu messen
//TTask.WaitForAll(LTasks); // <---- Meldet immer 'Mindestens ein Array ist nil'
lblZeitGesamt.Caption := 'Gesamt Zeit: ' + FormatDateTime('hh:nn:ss:zzz', Now - FirstTime);
end;
Das gesamte Projekt ist im Anhang.
Verbesserungs Vorschläge sind immer gern gesehen.