Einzelnen Beitrag anzeigen

Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: DirList optimieren

  Alt 8. Sep 2019, 16:15
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.
Angehängte Dateien
Dateityp: zip DirListTaskV1.zip (54,5 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat