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
Blup

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 09: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.740 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Schnelle Methode, um eine Dateiliste zu erstellen

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

  Alt 24. Feb 2021, 10: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 10:46 Uhr)
  Mit Zitat antworten Zitat
Andreas13

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

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
 
#8

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
Blup

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

AW: Schnelle Methode, um eine Dateiliste zu erstellen

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


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 06:05 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