Autor Beitrag
jackle32
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Mi 26.09.07 09:30 
Hallo,

ich hab ein Problem mit FindFirst bzw. Find Next. Ich hab mir mit der "standard" Suchfunktion (kommt gleich) die Möglichkeit Verzeichnisse zu durchsuchen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.GetFilesInDirectory(ADirectory: string; AMask: String; ARekursiv: Boolean);
var
  SR: TSearchRec;
begin
  if (ADirectory<>''and (ADirectory[length(ADirectory)]<>'\'then
    ADirectory:=ADirectory+'\';


  if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0then begin
    repeat
      //if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then
          templist.Add(ADirectory+SR.Name);
          combobox2.Items.Add(SR.Name);
          Anzahl.Text := IntToStr(StrToInt(Anzahl.Text)+1);
          application.ProcessMessages;
    until (FindNext(SR)<>0or Abbruch;
    FindClose(SR);
  end;


  if ARekursiv then
    if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0then
    begin
      repeat
        if (SR.Name<>'.'and (SR.Name<>'..'then
          GetFilesInDirectory(ADirectory+SR.Name,AMask,True);
      until (FindNext(SR)<>0or Abbruch;
      FindClose(SR);
    end;
end;


Soweit ja nichts neues, zu dieser Prozedur gibt es ja schon einige Themen im Forum. Wollte hier nur der Verständlichkeit halber und damit jeder weiß über was ich rede den gesamten Code posten.

Mein Frage ist jetzt speziell zu der Funktion "FindFirst" bzw. "FindNext".
Kennt jemand eine Möglichkeit die eigentliche FindFirst Funktion abzubrechen.

Hintegrund:
Ich habe einen Button Abbrechen mit dem ich die Boolean-Variable "Abbruch" auf True setze, damit bricht dann die repeat.. until Schleife ab, das aber erst wenn die nächste Datei nach drücken des Abbruch Buttons gefunden wurde. Dies ist ja auch klar, da die eigentliche Suche im FindFirst bzw. FindNext abläuft und er erst wieder in die until Bedinugungen rein läuft wenn er FindFirst bzw. FindNext durchlaufen hat. Jetzt kann es aber passieren, das ich große Verzeichnisse durchsuche und er lange keine passende Datei findet und ich dann ewig warte bis er die Suche beenden. D.h. hier wäre es gut, wenn ich die Funktion FindFirst bzw. FindNext direkt beenden könnte.

Gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 26.09.07 09:39 
Ich denke, dass das Problem bei dir darin liegt, dass du trotz "Abbruch" rekursiv die Verzeichnisse weiter durchgehst. Mit
 if ARekursiv AND (Not Abbruch) then ...
sollte sich das beheben lassen. GGf. nach dem ersten Block noch ein APM hinzufügen.

_________________
We are, we were and will not be.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 26.09.07 10:23 
user profile iconjackle32 hat folgendes geschrieben:
Hallo,
...
Mein Frage ist jetzt speziell zu der Funktion "FindFirst" bzw. "FindNext".
Kennt jemand eine Möglichkeit die eigentliche FindFirst Funktion abzubrechen.
...
Gruß Jack


Hallo Jack,

ganz allgemein, es gibt keine Möglichkeit, eine einmal aufgerufene Win32-Funktion abzubrechen. Einziger Ausweg: du lagerst das Ganze in einen eigenen Thread aus (die Auswertung der Abbruchbedingung solltest du drinlassen!) und beendest bei Bedarf den Thread. Ob Windows dann sofort die Suche einstellt oder noch im Hintergrund eine Weile weiterwerkelt, kannst du nicht wirklich beeinflussen, aber deiner Anwendung kann es egal sein.

Gruss Reinhard
jackle32 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 7

Win7
Delphi XE5 Starter, RAD Studio XE7 Pro
BeitragVerfasst: Mi 26.09.07 10:34 
Okay, die Idee mit dem Rekursiven Aufruf war gut, jetzt bricht er schon schneller, jetzt hab ich nur noch das warten, wenn er einen Ordner mit vielen Dateien durchsucht und keine gesuchte Datei dabei ist. Den Ordner durchsucht er jetzt trotzdem noch komplett.
Aber wenn es nur über einen eigenen Thread geht, dann is des doch für dieses recht kleine Programm zu aufwändig.

Besten Danke für die Hilfe!! :zustimm:

Gruß Jack

_________________
Es gibt keine dummen Fragen, nur dumme Antworten.