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
Andreas13

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 10: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.757 Beiträge
 
Delphi 12 Athens
 
#2

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 10: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
 
#3

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 10: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.757 Beiträge
 
Delphi 12 Athens
 
#4

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11: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
 
#5

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 11: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 11:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#6

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 12: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
AppCentral
  Mit Zitat antworten Zitat
DieDolly

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 12: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 12:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 12:46
Ich sage ja nicht, dass es nicht geht. Es gibt halt noch Lücken bei der Spezifikation bzw. man muss sich einige aus den diversen Posts hier erst zusammensuchen. Konkrete Beispiele wären sicher auch hilfreich.

Ohne Anspruch auf Vollständigkeit:

Kann LstInclude außer relativen Pfaden auch Dateinamen enthalten?
Wenn ja, haben die immer einen Pfad davor oder gelten die für alle Pfade? (z.B: alle readme.txt in allen durchsuchten Verzeichnissen)
Sind Wildcards erlaubt?
Kann LstInclude bzw. LstExclude auch absolute Pfade und/oder Dateinamen enthalten?
Wenn ja, können die von Root abweichen?
Was ist, wenn sich LstInclude und LstExclude widersprechen?

Ich könnte mir eine ganze Reihe von Test-Cases vorstellen, um die unterschiedlichen Fälle abzudecken.
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
 
#9

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 13:02
Zitat:
Kann LstInclude außer relativen Pfaden auch Dateinamen enthalten?
Wenn ja, haben die immer einen Pfad davor oder gelten die für alle Pfade? (z.B: alle readme.txt in allen durchsuchten Verzeichnissen)
Sind Wildcards erlaubt?
Kann LstInclude bzw. LstExclude auch absolute Pfade und/oder Dateinamen enthalten?
Wenn ja, können die von Root abweichen?
Was ist, wenn sich LstInclude und LstExclude widersprechen?
1) das können Verzeichnisnamen und Dateinamen sein, richtig
2) es ist nie ein Pfad davor bzw. es sollte keiner davor sein
3) Wildcards * und ?, beide werden von PathMatchSpecW unterstützt. Datei.* , *.txt , Dat??.txt usw.
4) siehe 2. Der Basispfad darf nicht dabei sein
5) nein
6) wenn LstInclude Count>0 ist, wird LstExclude ignoriert.

Was widersprecht denn der Nutzung von deinem Code ListFiles() mit meinen Änderungen außer, dass keine Wildcards funktionien?
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz