AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!
Thema durchsuchen
Ansicht
Themen-Optionen

Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

Ein Thema von Hipp0 · begonnen am 2. Aug 2007 · letzter Beitrag vom 3. Aug 2007
Antwort Antwort
Hipp0

Registriert seit: 2. Aug 2007
Ort: Olpe
5 Beiträge
 
#1

Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 2. Aug 2007, 20:37
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:

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.

Schonmal vielen Dank!
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.929 Beiträge
 
Delphi 12 Athens
 
#2

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 2. Aug 2007, 21:17
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Hipp0

Registriert seit: 2. Aug 2007
Ort: Olpe
5 Beiträge
 
#3

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 2. Aug 2007, 23:30
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?

Vielen Dank
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 2. Aug 2007, 23:33
Moin Hipp0,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Die Suchtiefe kannst Du doch einfach als zusätzlichen var-Parameter mit angeben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hipp0

Registriert seit: 2. Aug 2007
Ort: Olpe
5 Beiträge
 
#5

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 2. Aug 2007, 23:47
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 2. Aug 2007, 23:57
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:

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

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hipp0

Registriert seit: 2. Aug 2007
Ort: Olpe
5 Beiträge
 
#7

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 3. Aug 2007, 00:12
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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 3. Aug 2007, 00:28
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
  Mit Zitat antworten Zitat
Hipp0

Registriert seit: 2. Aug 2007
Ort: Olpe
5 Beiträge
 
#9

Re: Suchfunktion nur bis zu einem Bestimmt Pfadpunkt!

  Alt 3. Aug 2007, 12:51
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:38 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