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 2 von 3     12 3      
Blup

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11:10
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?
Ist auf jeden Fall langsamer, da jedes Verzeichnis zwei mal durchsuncht wird.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11:14
Ich bin mir nicht sicher, ob ich das richtig verstanden habe, aber hier mal ein Entwurf mit Verwendung der System.IOUtils. Erstmal ungetestet und ohne Berücksichtigung der Performance.

Delphi-Quellcode:
procedure ListFiles(const Root: string; LstInclude, LstExclude, Target: TStrings);
var
  path: string;
  S: string;
  skip: Boolean;
begin
  if (LstInclude <> nil) and (LstInclude.Count > 0) then begin { Includes vorhanden? }
    for path in LstInclude do
      Target.AddStrings(TDirectory.GetFiles(TPath.Combine(Root, path), '*.*', TSearchOption.soAllDirectories));
  end
  else if (LstExclude <> nil) and (LstExclude.Count > 0) then begin { Excludes vorhanden? }
    for path in TDirectory.GetDirectories(Root, '*', TSearchOption.soAllDirectories) do begin
      { ist es ein Exclude Path? }
      skip := False;
      for S in LstExclude do
        if path.StartsWith(TPath.Combine(Root, S), True) then begin
          skip := True;
          Break;
        end;
      if not skip then
        Target.AddStrings(TDirectory.GetFiles(path, '*.*', TSearchOption.soTopDirectoryOnly));
    end;
  end
  else begin { keine Einschränkungen }
    Target.AddStrings(TDirectory.GetFiles(Root, '*.*', TSearchOption.soAllDirectories));
  end;
end;
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
 
#13

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11:26
Ich teste das gleich mal durch. Auf den ersten Blick kann man nur Pfade in die Listen hinzufügen.
Was muss ich abändern, damit man auch Dateien einfügen kann?

Die Listen können Datei-Pfade enthalten.

Wenn ich das Root E:\ habe und in E der Ordner Dateien ist, dort drin eine Datei Test.txt, diese möchte ich gerne ein- oder ausschließen können, den Rest der Dateien in diesem Ordner aber nicht.
Zeitgleich natürlich auch ganze Verzeichnisse so wie es jetzt schon ist.

Ist das hier ok?
Delphi-Quellcode:
function IsDirectory(const aFileName: string): Boolean;
var
 R: DWORD;
begin
 R := GetFileAttributes(PChar(aFileName));
 Result := (R <> DWORD(-1)) and ((R and FILE_ATTRIBUTE_DIRECTORY) <> 0);
end;

   for path in LstInclude do
    begin
     if IsDirectory(TPath.Combine(Root, path)) then
      Target.AddStrings(TDirectory.GetFiles(TPath.Combine(Root, path), '*.*', TSearchOption.soAllDirectories))
     else
      Target.Add(TPath.Combine(Root, path));
    end;

Geändert von DieDolly (24. Feb 2021 um 11:46 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#14

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11:35
Hallo Uwe,
In 3 Zeilen
Delphi-Quellcode:
Target.AddStrings(TDirectory.GetFiles(TPath.Combine(Root, path), '*.*', TSearchOption.soAllDirectories));
..
Target.AddStrings(TDirectory.GetFiles(path, '*.*', TSearchOption.soTopDirectoryOnly));
..
Target.AddStrings(TDirectory.GetFiles(Root, '*.*', TSearchOption.soAllDirectories));
gibt XE5 kommt folgende Fehlermeldung:
[dcc32 Fehler] PDBiA_System.pas(1309): E2250 Es gibt keine überladene Version von 'AddStrings', die man mit diesen Argumenten aufrufen kann

Was müßte ich an Deinem Code ändern, damit es auch bei XE5 funktioniert?
Danke im Voraus!
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11:42
Was müßte ich an Deinem Code ändern, damit es auch bei XE5 funktioniert?
Z.B. einen Class-Helper schreiben, der ein AddStrings für ein string-Array unterstützt.
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
 
#16

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11:46
Bei LstExclude bleibt Target leider leer. Wenn ich Dateien\Test.txt in LstExclude hinzufüge, bleibt die Liste komplett leer.
Änderre ich TDirectory.GetDirectories zu TDirectory.GetFiles ab, funktioniert es. Aber ist das noch so gewollt?

Hier meine Änderungen, damit auch Dateien funktionieren
Delphi-Quellcode:
function IsDirectory(const aFileName: string): Boolean;
var
 R: DWORD;
begin
 R := GetFileAttributes(PChar(aFileName));
 Result := (R <> DWORD(-1)) and ((R and FILE_ATTRIBUTE_DIRECTORY) <> 0);
end;

procedure ListFiles(const Root: string; LstInclude, LstExclude, Target: TStrings);
var
 path: string;
 S: string;
 skip: Boolean;
begin
 if (LstInclude <> nil) and (LstInclude.Count > 0) then
  begin {Includes vorhanden?}
   for path in LstInclude do
    begin
     if IsDirectory(TPath.Combine(Root, path)) then
      Target.AddStrings(TDirectory.GetFiles(TPath.Combine(Root, path), '*.*', TSearchOption.soAllDirectories))
     else
      Target.Add(TPath.Combine(Root, path));
    end;
  end
 else if (LstExclude <> nil) and (LstExclude.Count > 0) then
  begin {Excludes vorhanden?}
   for path in TDirectory.GetFiles(Root, '*.*', TSearchOption.soAllDirectories) do
    begin
     {ist es ein Exclude Path?}

     for S in LstExclude do
      begin
       skip := False;
       if path.StartsWith(TPath.Combine(Root, S), True) then
        begin
         skip := True;
         Break;
        end;
      end;

     if not skip then
      begin
       if IsDirectory(TPath.Combine(Root, path)) then
        Target.AddStrings(TDirectory.GetFiles(path, '*.*', TSearchOption.soTopDirectoryOnly))
       else
        Target.Add(TPath.Combine(Root, path));
      end;
    end;
  end
 else
  begin {keine Einschränkungen}
   Target.AddStrings(TDirectory.GetFiles(Root, '*.*', TSearchOption.soAllDirectories));
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 12:30
Die Anforderung, dass die Listen auch Dateinamen (oder womöglich auch Wildcards) enthalten können, macht einen geänderten Ansatz notwendig. Deine Änderungen weichen zu stark von meinem Vorschlag ab, als dass das noch funktionieren würde.
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
 
#18

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 12:45
Schade dann weiß ich leider nicht weiter als mit FindFirst und FindNext, was aber wieder langsam ist wenn ich das mache weil ich alle Dateien durchgehe.

Schade weil... ich habe noch ein altes Programm rumliegen (nur die ausführbare Datei) wo so ein alter Code von mir angewendet wird.
Bei meiner Festplatte P:\ (portable programme, 66 Verzeichnisse, 1 soll in die LstInclude-List) dauert das 10 Sekunden.
Mit deinem Code und meinen (schlechten) Änderungen, 12 Millisekunden!

Geändert von DieDolly (24. Feb 2021 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 13:31
Die schnellste Variante wäre es so zu machen wie Everything und andere Tools:
Direkt auf die NTFS Datenbank zugreifen.

Damit kann man innerhalb von Millisekunden selbst Partitionen mit vielen Dateien durchsuchen.
https://blogs.msmvps.com/bsonnino/20...fs-structures/

Leider braucht man dafür Adminrechte und es ist auch nicht so einfach.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
DieDolly

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 13:43
Adminrechte sind ausgeschlossen, da ich Zugriff auf Netzlaufwerke brauche.
Uwe's Lösung ist schon wahnsinnig schnell, jetzt fehlen nur noch Wildcards. Dateien hab ich schon ergänzt.
Für Wildcards kenne ich nur PathMatchSpecW.

Geändert von DieDolly (24. Feb 2021 um 13:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:48 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