Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Schnelle Methode, um eine Dateiliste zu erstellen (https://www.delphipraxis.net/207087-schnelle-methode-um-eine-dateiliste-zu-erstellen.html)

DieDolly 23. Feb 2021 12:59

Schnelle Methode, um eine Dateiliste zu erstellen
 
Vielleicht erst ein kleiner Hintergrund.
Ich habe früher mal anhand zweiter StringListen, die gefüllt sein können aber nicht müssen, eine weitere Liste erstellen lassen (eine Dateiliste).
Die eine StringListe enthielt (kann, muss nicht) Pfade, die unbedingt vom Such-Algorithmus (bei mir damals FindFirst, FindNext) in der neuen Dateiliste aufgenommen werden sollen. Die zweite StringListe enthielt Pfade, die in keinem Fall in der Dateiliste aufgenommen werden sollen.

Beispiele:
- war die erste StringListe gefüllt, wurden auch nur diese Pfade in der neuen Dateiliste aufgenommen.
- war die zweite gefüllt, wurden alle außer die in der Liste in die Dateiliste aufgenommen.

Basierend auf einem Verzeichnis "E:\": diese StringListen können beispielsweise enthalten
- Dateien
- Arbeit
- Freizeit\Fotos

Im o.g. Beispiel würden nur die Verzeichnisse "Dateien", "Arbeit" und "Freizeit\Fotos" in die neue Dateiliste übernommen (erste Liste)
ODER
alle außer genau die oben genannten (zweite Liste).


Meine vorgehensweise damals war in etwa so:
- FindFirst/FindNext-Procedure (in sich selbst aufrufend, wegen der Unterverzeichnisse)
-- jede Datei, jedes Verzeichnis das gefunden wird durch eine Funktion laufen lassen, die eine Schleife durchläuft und die StringListe prüft.
Und irgendwie habe ich beide Listen in das ganze Ding reingepackt mit if's und else's und viel zu kompliziert.


Wie realisiert man sowas mit D10.3.3 am besten? Ich habe leider keinen Code mehr davon. Ich weiß nur noch, dass das mit StringListen-Abgleich mindestens um den Faktor 10 langsamer war als ohne.

TurboMagic 23. Feb 2021 18:05

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Naja, du könntest mal anschauen was IOUtils so alles bietet.
Zum Beispiel TPath...

Uwe Raabe 23. Feb 2021 22:27

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Die Anforderungen sind aber noch nicht vollständig definiert, oder?

Was soll passieren, wenn beide Listen gefüllt sind?
Welche Liste hat Vorrang, wenn die Listen sich widersprechen?

DieDolly 24. Feb 2021 00:17

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Zitat:

Was soll passieren, wenn beide Listen gefüllt sind?
Beide Listen können nie zeitgleich gefüllt sein.

Ist die erste Liste gefüllt, wird die zweite gar nicht erst befüllt und kann ignoriert werden.
Wie das andersherum aussieht, muss ich noch überlegen.

Die erste Liste soll ausschließlich ihre Einträge vergleichen und Funde in eine Dateiliste schreiben.
Die zweite Liste soll ihre Einträge vergleichen und Funde sollen nicht zur Dateiliste hinzugefügt werden.

KodeZwerg 24. Feb 2021 01:33

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Das mit den verschiedenen Listen habe ich noch nicht so ganz verstanden, jedenfalls finde ich die schnellste Methode es über PItemIdList zu Lösen. Es ist gleichzeitig nicht die einfachste Möglichkeit da mehr Code benötigt wird.

In der Paxis kannst Du es testen indem Du mal TotalCommander (Shareware Datei-Manager) installierst und in ein Verzeichnis mit Tausenden von Dateien lotst.
Gegenüber FindFirst() ist das der Ferrari :)

In Kombination mit einem Verzeichnis-Monitor wirst du eventuell gar keine zwei Listen benötigen sondern einfach PIDLs sich selbst aktualisieren lassen.

Es gab mal eine VirtualShellView Demo von Borland um sich damit anzufreunden.

Vielleicht liege ich auch total daneben, dann tut es mir leid.

DieDolly 24. Feb 2021 08:25

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1483653)
Das mit den verschiedenen Listen habe ich noch nicht so ganz verstanden

Halb-zitiert von mir:
Diese StringListen können beispielsweise nach einer Eingabe diesen Inhalt haben
- Dateien
- Arbeit
- Freizeit\Fotos

Wenn das da oben in der ersten Liste steht: nur die Verzeichnisse "Dateien", "Arbeit" und "Freizeit\Fotos" würden in die neue Dateiliste übernommen
ODER
wenn das in der zweiten Liste streht: alle außer genau die oben genannten werden in die neu Dateiliste übernommen.

Also quasi "Füge nur diese Dateien (wenn gefunden) in die Dateiliste ein (erste Liste)
oder
füge alle Dateien außer die oben (wenn gefunden) in die Dateiliste ein (zweite Liste).

Blup 24. Feb 2021 10:22

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Man benötigt eigentlich immer zumindest ein zu durchsuchendes Verzeichnis.
Deshalb würde ich dieses in der Liste der zu durchsuchenden Verzeichnisse übergeben.
Die Verzeichnisse, die von der Suche ausgeschlossen sind, sollten aber dann höhere Priorität haben.
Bsp. Wenn "c:\" dursucht werden soll und "c:\temp" ausgeschlossen ist.

Ungetestet:
Delphi-Quellcode:
procedure FindFiles(ADirList: TStrings; const AFileMask: string; AExcludeDirList: TStrings; AFileList: TStrings);
var
  SubDirList: TStringList;
  FindInfo: TSearchRec;
  sDir: string;
begin
  SubDirList := TStringList.Create;
  try
    for sDir in ADirList do
    begin
      if AExcludeDirList.IndexOf(sDir) < 0 then
      begin
        if FindFirst(sDir + AFileMask, faAnyFile, FindInfo); then
        begin
          try
            repeat
              if (FindInfo.Attr and faDirectory) = faDirectory then
 
              begin
                if (FindInfo.Name <> '.') and (FindInfo.Name <> '..') then
                  SubDirList.Add(sDir + FindInfo.Name + '\');

              end
              else
                AFileList.Add(sDir + FindInfo.Name);
            until not FindNext(FindInfo);
          finally
            FindClose(FindInfo);
          end;
        end;

        if SubDirList.Count > 0 then
        begin
          FindFiles(SubDirList, AFileMask, AExcludeDirList, AFileList);  
          SubDirList.Clear;
        end;
      end;
    end;
  finally
    SubDirList.Free;
  end;
end;

DieDolly 24. Feb 2021 10:31

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Zitat:

Deshalb würde ich dieses in der Liste der zu durchsuchenden Verzeichnisse übergeben.
Verstehe diesen Satz nicht. Das zu durchsuchende Verzeichnis darf nicht in einer der beiden Listen vorkommen.
Die beiden Listen dürfen nur Unterverzeichnisse dieses Verzeichnisses beinhalten.

Jumpy 24. Feb 2021 10:50

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Keine Ahnung ob das schneller ist, aber könnte man nicht erst nur nach Verzeichnissen suchen, die den Kriterien entsprechen und diese in eine Liste schreiben und dann anschließen in allen Verzeichnissen in dieser Liste die Dateien suchen?

Blup 24. Feb 2021 11:09

AW: Schnelle Methode, um eine Dateiliste zu erstellen
 
Zitat:

Zitat von DieDolly (Beitrag 1483668)
Zitat:

Deshalb würde ich dieses in der Liste der zu durchsuchenden Verzeichnisse übergeben.
Verstehe diesen Satz nicht. Das zu durchsuchende Verzeichnis darf nicht in einer der beiden Listen vorkommen.
Die beiden Listen dürfen nur Unterverzeichnisse dieses Verzeichnisses beinhalten.

Nach deiner Beschreibung gibt es zwei Anwendungsfälle:
1: Eine List von Verzeichnissen soll durchsuncht werden, einschliesslich Unterverzeichnisse.
Delphi-Quellcode:
procedure Fall1(ASuchList: TStrings; const AFileMask: string; AFileList: TStrings);
var
  EmptyList: TStringList;
begin
  EmptyList := TStringList.Create;
  try
    FindFiles(ADirList, AFileMask, EmptyList, AFileList);
  finally
    EmptyList.Free;
  end;
end;
2: Ein Verzeichnis soll durchsucht werden, einschliesslich Unterverzeichniss. Bestimmte Unterverzeichnisse sollen komplett ausgeschlossen werden.
Delphi-Quellcode:
procedure Fall2(const ASuchDir: string; const AFileMask: string; AExcludeDirList: TStrings; AFileList: TStrings);
var
  DirList: TStringList;
begin
  DirList := TStringList.Create;
  try
    DirList.Add(ASuchDir);
    FindFiles(DirList, AFileMask, EmptyList, AFileList);
  finally
    DirList.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf