Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Suchfunktion nur bis zu einem Bestimmt Pfadpunkt! (https://www.delphipraxis.net/96993-suchfunktion-nur-bis-zu-einem-bestimmt-pfadpunkt.html)

Hipp0 2. Aug 2007 19:37


Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Hallo zusammen,
Ich habe folgendes Problem:
Ich möchte eine procedure schreiben die einen bestimmten Ordner nur bis zu einem bestimmten Punkt durchsucht weil es sonst zu lange dauern würde alles zu durchsuchen. Die Struktur sieht folgendermaßen aus:


Hier soll noch drin gesucht werden!(Und zwar soll auch der Ordnername an sich gefunden werden)
X:\14.14.14

Hier auch noch (jedoch muss hier nur eine bestimmte Datei mit einer bestimmten Endung(.ser) gefunden werden)
X:\14.14.14\Datensicherung

Hier nicht mehr also die Ordner (CFG DTA UND EMG) sollen komplett bei der suche ignoriert werden
X:\14.14.14\Datensicherung\CFG
X:\14.14.14\Datensicherung\DTA
X:\14.14.14\Datensicherung\EMG

Von diesen Zahlenordnern wird es später sehr viele geben.

Ich habe versucht folgenden Code zu verändern ist mir aber nicht gelungen: :coder2:

Delphi-Quellcode:

var
  SR: TSearchRec;
begin
  if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then
    ADirectory:=ADirectory+'\';


  if (FindFirst(ADirectory+AMask,faDirectory,SR)=0) then begin
    repeat



      if (SR.Name<>'.') and (SR.Name<>'..') {(SR.Attr<>faDirectory)} then
      If CheckBox1.checked = true then AList.Add(ADirectory+SR.Name) else AList.Add(SR.Name)
    until FindNext(SR)<>0;
    FindClose(SR);
  end;

 
  if ARekursiv then
    if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then
    begin
      repeat
        if (SR.Name<>'.') and (SR.Name<>'..') then
          GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True);
      until FindNext(SR)<>0;
      FindClose(SR);
    end;
Dann habe ich mir überlegt erst alle Ordnerpfade(die mit den Zahlen) die sich auf dem Laufwerk befinden zwischen zu speichern und dann jeden durch einen neuen Aufruf nochmal zu durchsuchen. Das gleich dann mit dem Datensicherungsordner. Jedoch gefällt mir diese Lösung garnicht.

Vielleicht habt ihr Lust und Zeit mir zu helfen ich selbst komme nämlich nicht mehr weiter. :wall:

Schonmal vielen Dank!

QuickAndDirty 2. Aug 2007 20:17

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Zähl einen Zähler "Suchtiefe" mit und auf wenn dieser Level 2 erreicht taucht er nicht mehr in neue Ordner ab.
Wenn der Ordner durch ist senkst du ihn wieder.
Wenn du in einen Neuen Ordner eintaucht zählst ihn wieder hoch.

Hipp0 2. Aug 2007 22:30

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Danke für den Vorschlag ich sehe nur bei der Umsetzung Probleme da das ganze rekursiv gestaltet ist. Oder stehe ich gerade auf einem Megaschlauch? :oops:

Vielen Dank

Christian Seehase 2. Aug 2007 22:33

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Moin Hipp0,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Die Suchtiefe kannst Du doch einfach als zusätzlichen var-Parameter mit angeben.

Hipp0 2. Aug 2007 22:47

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Hallo und danke für die Begrüßung :)

So ganz verstehe ich das immer noch nicht wie ihr das meint.

Delphi-Quellcode:

procedure TForm1.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean);
var
  SR: TSearchRec;
  Suchtiefe : integer; //  das hier ist ja klar
  begin
  if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then
    ADirectory:=ADirectory+'\';
  if (FindFirst(ADirectory+AMask,faDirectory,SR)=0) then begin
    repeat
      if (SR.Name<>'.') and (SR.Name<>'..') {(SR.Attr<>faDirectory)} then
      If CheckBox1.checked = true then begin AList.Add(ADirectory+SR.Name); suchtiefe := 0; end else AList.Add(SR.Name) //hier bin ich mir nicht sicher und so klappt es auch nicht :)
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
  if ARekursiv then
    if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then
    begin
      repeat
        if (SR.Name<>'.') and (SR.Name<>'..') then
          GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True); Suchtiefe := suchtiefe+1; //und hier muss ich sie eins hochsetzen oder?
      until FindNext(SR)<>0;
      FindClose(SR);
    end;
end;

Vielen Dank für eure mühen

Christian Seehase 2. Aug 2007 22:57

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Moin Hipp0,

Du ergänzt die Parameterliste Deiner Methode um einen Parameter:

Delphi-Quellcode:
// statt
procedure TForm1.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean);

// einfach
procedure TForm1.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean;var suchtiefe : integer);
Beim ersten Aufruf wird dann, z.B. 1 übergeben, beim nächsten um 1 erhöht usw.
Dann weiss jede Rekursionstiefe, wie tief sie ist.

Hmm...
Wenn man es genau nimmt, brauchst Du nicht einmal einen var-Parameter:

Delphi-Quellcode:
procedure TForm1.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean;const suchtiefe : integer);
genügt eigentlich.
Es muss dann nur immer

Delphi-Quellcode:
GetFilesInDirectory(.......,Suchtiefe+1);
übergeben werden.

Hast Du dann gewünschte Limit erreicht, verlässt Du die Routine einfach gleich wieder, oder rufst sie gar nicht erst auf (was wohl sinnvoller wäre).

Durch einen weiteren Parameter kannst Du dann auch noch bestimmen, wo die Grenze liegen soll. Das würde die Methode noch flexibler machen.

Hipp0 2. Aug 2007 23:12

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Moin Chris,
Vielen Dank. Ein TOP Forum habt ihr hier. Mir wurde selten so schnell geholfen.
Es klappt jetzt genau nach meinen Vorstellungen.

Delphi-Quellcode:

procedure TForm1.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean;const suchtiefe : integer;suchtiefeendwert :integer);
var
  SR: TSearchRec;

  begin
  if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then
    ADirectory:=ADirectory+'\';
  if (FindFirst(ADirectory+AMask,faDirectory,SR)=0) then begin
    repeat
      if (SR.Name<>'.') and (SR.Name<>'..') {(SR.Attr<>faDirectory)} then
      If CheckBox1.checked = true then begin AList.Add(ADirectory+SR.Name); Alist.Add(inttostr(Suchtiefe)) end else AList.Add(SR.Name)
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
  if ARekursiv then
    if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then
    begin
      repeat
        if (SR.Name<>'.') and (SR.Name<>'..') and (suchtiefe<suchtiefeendwert) then
          GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True,suchtiefe+1,suchtiefeendwert);
      until FindNext(SR)<>0;
      FindClose(SR);
    end;
end;
So werde ich es erstmal ausprobieren!hoffentlich erreiche ich hiermit den gewünschten Geschwindigkeitszuwachs.

nochmals Vielen Dank

Gruß
Hipp0

Hawkeye219 2. Aug 2007 23:28

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Hallo,

hier sind noch zwei Anregungen:

Wenn du beim ersten Aufruf die maximale Suchtiefe übergibst und dann nur noch herunterzählst, dann kannst du die Funktion der letzten drei Parameter in diesem einen Parameter vereinen.

Der Zugriff auf die CheckBox bindet die Routine zu sehr an das Formular. Übergib das Flag in einem Parameter, dann kannst du aus der Formular-Methode eine (Bibliotheks-)Routine machen, die du möglicherweise in anderen Projekten wiederverwenden kannst.

Zum Vergleich mit True: Über den Umgang mit Boolean

Gruß Hawkeye

Hipp0 3. Aug 2007 11:51

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
 
Hallo Hawkeye
Danke für die Anregungen. Ich werde mir das auf jeden Fall überlegen, vorallem das zusammenfassen der Paramater. Aber erstmal muss ich das Programm fertig bekommen bin ein wenig in Zeitnot.

Gruß
Hipp0


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