![]() |
Status von FindAllFiles (Suche beendet?)
Hallo zusammen,
ich benutze diese Prozedur ![]() Ich habe in meinem Programm ein zusätzliches Form, das anzeigt, dass gesucht wird und einen Abbrechen-Button. Wenn dieser gedrückt wird, soll die Suche abgebrochen werden. Das ganze habe ich über Events gesteuert. Jetzt meine Frage: Wie kann ich in der Prozedur FindAllFiles abfragen/feststellen, dass sie regulär beendet wurde? Mir schwebt da so etwas vor:
Delphi-Quellcode:
FCancelled wird gesetzt, wenn der Benutzer Abbrechen gedrückt hat.
while not FCancelled and not FFinished then
begin ... //Inhalt von FindAllFiles end; Wann/Wie/Wo kann ich in FindAllFiles die Variable FFinished füllen, wenn die Rekursion abgeschlossen wird? Vielen Dank und freundliche Grüße Lorenz |
Re: Status von FindAllFiles (Suche beendet?)
Delphi-Quellcode:
Oder was meinst Du?
while not FCancelled and not FFinished then
begin ... //Inhalt von FindAllFiles end; FFinished := true; //Ende der Rekursion [edit] Blödsinn! Du musst FFinished setzen, wenn keine weiteren Dateien gefunden wurden.[/edit] |
Re: Status von FindAllFiles (Suche beendet?)
Zitat:
Nur wie mache ich das, wie kann ich es abfragen, wenn er keine Datei mehr gefunden hat? |
Re: Status von FindAllFiles (Suche beendet?)
In der Prozedur wird es wahrscheinlich ziemlich am Schluss ein FindClose geben. Das wäre ein guter Zeitpunkt.
|
Re: Status von FindAllFiles (Suche beendet?)
Stimmt, daran habe ich gar nicht gedacht. Vielen Dank.
MFG Lorenz |
Re: Status von FindAllFiles (Suche beendet?)
Ich muss hier doch noch mal eine Post aufmachen.
Mit der Rekursion und dem setzen des Bool'schen Parameters, das bekomme ich noch nicht so ganz hin. :wiejetzt:
Delphi-Quellcode:
Wenn eine Datei gefunden wurde, setze ich FFinished auf False, bei dem FindClose wieder auf True.
procedure TForm_Main.TransferToDB(Sender : TObject);
begin FFinished := False; FindAllFiles(FOrdner, '*.' + FTyp, FRekursion); end; procedure TForm_Main.FindAllFiles(RootFolder: String; Mask: String = '*.*'; Recurse: Boolean = true); var wfd : TWin32FindData; hFile : THandle; begin while not FCancelled or not FFinished do begin FFinished := True; if (AnsiLastChar(RootFolder)^ <> '\') then RootFolder := RootFolder + '\'; if Recurse then begin hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd); if (hFile <> INVALID_HANDLE_VALUE) then begin FFinished := False; try 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; finally FFinished := True; Windows.FindClose(hFile); end; end; (* of if *) end; (* of if *) hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd); if (hFile <> INVALID_HANDLE_VALUE) then begin FFinished := False; try 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; finally FFinished := True; Windows.FindClose(hFile); end; end; (* of if *) end; end; Nach Beginn setze ich FFinished auch auf True, für denn Fall, dass gar keine Datei gefunden wird. Und vor dem Aufruf von FindAllFiles setze ich es auf False, damit die Schleife durchlaufen wird. Allerdings liest der Code die Dateien immer von vorne ein, wenn ich einen Ordner durchsucht habe, könnt ihr mir da bitte nochmal helfen? :stupid: Vielen Dank und freundliche Grüße Lorenz |
Re: Status von FindAllFiles (Suche beendet?)
Delphi-Quellcode:
Sollte er nicht so lange laufen, so lange beide Option nicht gesetzt sind?
while not FCancelled or not FFinished do
|
Re: Status von FindAllFiles (Suche beendet?)
Delphi-Quellcode:
Ändere das mal.
while not FCancelled or not FFinished do
Delphi-Quellcode:
[edit] Schon wieder zu spät :? [/edit]
while not (FCancelled or FFinished) do
|
Re: Status von FindAllFiles (Suche beendet?)
Danke euch beiden.
Jetzt werden allerdings nur die Dateien des ersten Unterordners aufgelistet und die anderen Unterordner werden gar nicht mehr durchlaufen. Vorher hat er auch nur Dateien des ersten Unterordners aufgelistet, dafür das dann wiederholt (was ja auch falsch war). Irgendwo hab ich doch noch die Variable FFinished falsch belegt? :gruebel: |
Re: Status von FindAllFiles (Suche beendet?)
Delphi-Quellcode:
1. Warum 2 IF Abfragen
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); 2. Warum der Typecast auf String vor der Abfrage? 3. Wer fügt denn wo den Backslash zwischen den Verzeichnissen ein? Du fügst an den Pfad einfach den namen des Ordners an. Aber eine Pfadangabe hat einen Backslash zur Trennung der Ordner... /EDIT: Zweiter Punkt hat sich erledigt, hatte übersehen, dass es sich um die WinAPI Funktionen handelt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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