Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Frage zu FindNext (https://www.delphipraxis.net/214254-frage-zu-findnext.html)

H.Bothur 12. Dez 2023 10:30

Frage zu FindNext
 
Moin,

ich habe hier eine Directorystruktur mit 1-3 Unterverzeichnissen:

AA
aa
ab
ac
BB
ba
bb
bba
bbb
bbc
CC
ca

das ganze durchsuche ich mit FindFirst / FindNext:

Delphi-Quellcode:
procedure FindFilesTree(aPath: string);
  SearchRec: tSearchRec;

begin
  if aPath [Length (aPath)] <> '\' then aPath := aPath + '\';

  if FindFirst (aPath + '*.*', faDirectory, SearchRec) = 0 then
  begin
    repeat
      // Wenn es sich um ein Verzeichnis handelt
      if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] <> '.') then
      begin
        if (SearchRec.Attr and faDirectory > 0) then
        begin
          (* Tu irgendwas *)
        end;
        // auf Untereinträge prüfen
        FindFilesTree(aPath + SearchRec.Name);

      end else
      // Eintrag ist eine Datei
      if aWithFiles and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
      begin
        (* Tu irgendwas anderes *)

  // solange weiter bis keine weiteren Dateien/Verzeichniss gefunden werden
    until FindNext(SearchRec) <> 0;

    (* hier für jedes Unterverzeichnis was machen *)
    FindClose(SearchRec);
  end;
end;
Das ganze klappt auch wunderbar (logisch, hab ich ja auch gut kopiert), aber ...

... die Stelle "(* hier für jedes Unterverzeichnis was machen *)" soll nicht mehr durchlaufen werden wenn es keine weiteren Unterverzeichnisse gibt - also wenn rekursiv alles durchlaufen ist.

Bekomme ich das irgendwie aus dem Ergebnis von FindNext mit oder muss ich da eine Hilfsvariable setzen die mir sagt wie tief ich gerade geschachtelt bin ?

Hans

jaenicke 12. Dez 2023 11:04

AW: Frage zu FindNext
 
Warum verwendest du nicht einfach die mitgelieferte Funktionalität von Delphi?
Delphi-Quellcode:
uses
  System.IOUtils;

var
  DirList: TArray<string>;
begin
  DirList := TDirectory.GetDirectories('c:\temp', '*', TSearchOption.soAllDirectories);
Das hat auch den Vorteil, dass es nicht nur unter Windows funktioniert.

H.Bothur 12. Dez 2023 12:34

AW: Frage zu FindNext
 
Zitat:

Zitat von jaenicke (Beitrag 1530709)
Warum verwendest du nicht einfach die mitgelieferte Funktionalität von Delphi?
Delphi-Quellcode:
  DirList := TDirectory.GetDirectories('c:\temp', '*', TSearchOption.soAllDirectories);
Das hat auch den Vorteil, dass es nicht nur unter Windows funktioniert.

1) Ehrlich gesagt kannte ich das noch nicht
2) bei einem ersten Versuch bekomme ich so alle Direktorys, aber nicht die Dateien darin aufgelistet.

Was mache ich denn wenn ich:

Verzeichnisse und Unterverzeichnisse habe
und zusätzlich auch die Dateien darin brauche ?

Gruss
Hans

lxo 12. Dez 2023 12:47

AW: Frage zu FindNext
 
Dateien kannst du mit TDirectory.GetFiles finden.

itsChris 12. Dez 2023 12:49

AW: Frage zu FindNext
 
Zitat:

Was mache ich denn wenn ich:

Verzeichnisse und Unterverzeichnisse habe
und zusätzlich auch die Dateien darin brauche ?
Zitat:

Zitat von lxo (Beitrag 1530721)
Dateien kannst du mit TDirectory.GetFiles finden.

Anschließend würde ich über DirList drüber iterieren und TDirectory.GetFiles(Pfad) aufrufen. Dann hast du die einzelnen Dateien.

H.Bothur 12. Dez 2023 12:56

AW: Frage zu FindNext
 
Ich steh da echt auf dem Schlauch und finde auch kein Beispiel ... kann mir mal jemand sagen was ich machen muss damit ich am Schluss folgendes Ergebnis habe:

AA
-aa
-ab
-ac
BB
-ba
--BB
---bba
---bbb
---bbc
CC
-ca

Das groß geschriebene sollen Verzeichnisse sein und die Kleinuchstaben Dateien.

Danke
Hans

himitsu 12. Dez 2023 13:49

AW: Frage zu FindNext
 
Delphi-Referenz durchsuchenTDirectory.GetFileSystemEntries
Delphi-Referenz durchsuchenTDirectory.GetDirectories
Delphi-Referenz durchsuchenTDirectory.GetFiles
https://docwiki.embarcadero.com/Code...ation_(Delphi)

Da kann man so viel mit rumspielen:
Delphi-Quellcode:
uses System.IOUtils, System.StrUtils, System.DateUtils;

//var Files := TDirectory.GetFiles('C:\ProgramData\Embarcadero');

//var Files := TDirectory.GetFiles('C:\ProgramData\Embarcadero', '*.slip');

//var Files := TDirectory.GetFiles('C:\ProgramData\Embarcadero', '*.slip', soAllDirectories);

var Files := TDirectory.GetFiles('C:\ProgramData\Embarcadero', '*.*', soAllDirectories,
  function(const Path: string; const SearchRec: TSearchRec): Boolean
  begin
    //var FullName := Path + SearchRec.Name;
    //Result := SearchRec.TimeStamp > StartOfTheDay(Now) - 14; // maximal zwei Wochen alt
    Result := EndsText(SearchRec.Name, '.slip');
  end);

for var FileName in Files do
  Memo1.Lines.Add(FileName);
oder direkt drin verarbeiten
Delphi-Quellcode:
TDirectory.GetFiles('C:\ProgramData\Embarcadero', '*.slip',
  function(const Path: string; const SearchRec: TSearchRec): Boolean // muß keine anonyme Methode sein ... Funktionen und KlassenMethoden gehn auch
  begin
    Memo1.Lines.Add(TPath.Combine(Path, SearchRec.Name));
    Result := True; // Result := not AbortButton.Down;
  end);
oder
oder
oder


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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