AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schnelle Methode, um eine Dateiliste zu erstellen

Ein Thema von DieDolly · begonnen am 23. Feb 2021 · letzter Beitrag vom 24. Feb 2021
Antwort Antwort
Seite 1 von 3  1 23      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 23. Feb 2021, 12:59
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.

Geändert von DieDolly (23. Feb 2021 um 13:09 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#2

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 23. Feb 2021, 18:05
Naja, du könntest mal anschauen was IOUtils so alles bietet.
Zum Beispiel TPath...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 23. Feb 2021, 22:27
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#4

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 00:17
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.

Geändert von DieDolly (24. Feb 2021 um 00:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 01:33
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 08:25
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).
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#7

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 10:22
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;
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#8

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 10:31
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.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#9

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 10:50
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?
Ralph
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#10

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11:09
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz