AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Status von FindAllFiles (Suche beendet?)
Thema durchsuchen
Ansicht
Themen-Optionen

Status von FindAllFiles (Suche beendet?)

Ein Thema von Reinhardtinho · begonnen am 17. Jan 2008 · letzter Beitrag vom 18. Jan 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#11

Re: Status von FindAllFiles (Suche beendet?)

  Alt 18. Jan 2008, 11:48
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#12

Re: Status von FindAllFiles (Suche beendet?)

  Alt 18. Jan 2008, 11:50
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
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Status von FindAllFiles (Suche beendet?)

  Alt 18. Jan 2008, 11:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#14

Re: Status von FindAllFiles (Suche beendet?)

  Alt 18. Jan 2008, 12:04
Wenn die Funktion das erste Verzeichnis "bis unten" abgearbeitet hat, wie steht dann FFinished?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#15

Re: Status von FindAllFiles (Suche beendet?)

  Alt 18. Jan 2008, 15:31
Hi,

Das Problem scheint gelöst.

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!

MFG
Lorenz
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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