Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Status von FindAllFiles (Suche beendet?) (https://www.delphipraxis.net/106837-status-von-findallfiles-suche-beendet.html)

DeddyH 18. Jan 2008 10:48

Re: Status von FindAllFiles (Suche beendet?)
 
Das ist eben das Problem bei Rekursion. Man müsste sich quasi einen "Ebenenzähler" einbauen, um festzustellen, wann man wieder im ursprünglichen Verzeichnis angelangt ist.

Reinhardtinho 18. Jan 2008 10:50

Re: Status von FindAllFiles (Suche beendet?)
 
Hi,

ich hab die Prozedur FindAllFiles von Matze aus der Code-Library.
Die Prozedur hat soweit immer funktioniert.

zu 2.) da vermute ich mal, das liegt daran, dass cFileName von eine Typ Array of Char oder so ist (so sieht es jedenfalls beim debuggen aus). Ist, wie gesagt aus der Code-Library.

zu 3.)

hier:
Zitat:

Delphi-Quellcode:
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';


MFG
Lorenz

Muetze1 18. Jan 2008 10:51

Re: Status von FindAllFiles (Suche beendet?)
 
Zitat:

Zitat von DeddyH
Das ist eben das Problem bei Rekursion. Man müsste sich quasi einen "Ebenenzähler" einbauen, um festzustellen, wann man wieder im ursprünglichen Verzeichnis angelangt ist.

Wieso sollte man? Zum einen ist ein Ebenenzähler nicht eindeutig, da man die "zweite Ebene" in vielen unterschiedlichen Ordnern der ersten Ebene findet. Somit nicht nutzbar.

Zum anderen: Warum muss man einen Ebenenzähler implementieren? Durch die Rekursion stehen doch alle (von Anfang an) aufgerufenen Funktionen immernoch an der Stelle des Aufrufs, bis diese zurückkehren. Also: Wozu bräuchte man einen Ebenenzähler?

/EDIT:

Jo, stimmt. Mein 2. und 3. Punkt vom vorherigen Beitrag haben sich erledigt.

DeddyH 18. Jan 2008 11:04

Re: Status von FindAllFiles (Suche beendet?)
 
Wenn die Funktion das erste Verzeichnis "bis unten" abgearbeitet hat, wie steht dann FFinished?

Reinhardtinho 18. Jan 2008 14:31

Re: Status von FindAllFiles (Suche beendet?)
 
Hi,

Das Problem scheint gelöst. :spin2:

Hab den Code ein bisschen umgestellt und frage jetzt nur noch FCancelled ab, bei dem rekursiven Aufruf.
Wenn der Benutzer Abbrechen drückt, wird noch der aktuelle Ordner fertig durchsucht und dann die Prozedur beendet.

Delphi-Quellcode:
procedure TForm_Main.FindAllFiles(RootFolder: String; Mask: String = '*.*'; Recurse: Boolean = true);
var
  wfd  : TWin32FindData;
  hFile : THandle;
begin
  if (AnsiLastChar(RootFolder)^ <> '\') then
    RootFolder := RootFolder + '\';

  if Recurse and not FCancelled then
  begin
    hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);

    try

      if (hFile <> INVALID_HANDLE_VALUE) and not FCancelled then
      begin
        repeat
          if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY) then
          if (String(wfd.cFileName) <> '.') and (String(wfd.cFileName) <> '..') then
            FindAllFiles(RootFolder + wfd.cFileName, Mask, Recurse);
        until FindNextFile(hFile, wfd) = False;
      end; (* of if *)
    finally
      Windows.FindClose(hFile);
    end;
  end; (* of if *)

  hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);

  try
    if (hFile <> INVALID_HANDLE_VALUE) and not FCancelled then
    begin
      repeat
        if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> FILE_ATTRIBUTE_DIRECTORY) then
        begin
          //Bearbeitung
          if (LowerCase(ExtractFileExt(wfd.cFileName)) = Copy(Mask, 2, Length(Mask) - 1)) then
            AddFileInfo(RootFolder + wfd.cFileName);

          Application.ProcessMessages;
        end; (* of if *)
      until FindNextFile(hFile, wfd) = False;
    end; (* of if *)
  finally
    Windows.FindClose(hFile);
  end;
end;

Vielen Dank an alle! :hi:

MFG
Lorenz


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr.
Seite 2 von 2     12   

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