Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fehler im Verzeichnis suchen Algo (https://www.delphipraxis.net/26071-fehler-im-verzeichnis-suchen-algo.html)

Master_BB 17. Jul 2004 15:59


Fehler im Verzeichnis suchen Algo
 
Hy Leutz,
hab ein Problem mit meinem Verzeichnissuch algorithmus auf Findfirst basierend.
Und zwar findet er nur die Verzeichnisse unter C:\ wen ich ihm als ausgangspfad c:\ gebe
und nicht die unterordner.
Wenn ich mir alles was er durchsucht ausgeben lasse sehe ich das er alle unterordner findet
jedoch gibt er mir als Result nicht den den er gefunden hat.

Hier der Code

Delphi-Quellcode:
function FindPath(ToBeFound, Path : string) : string;
var
  ASearchRec : TSearchRec;
begin
  Result   := '';

  if Path[Length(Path)] <> '\' then
    Path := Path + '\';

  if FindFirst(Path + '*.*', faDirectory, ASearchRec) = 0 then
  begin
    repeat
      if ((ASearchRec.Attr and faDirectory) = faDirectory) and
         (ASearchRec.Name                  <> '..')       and
         (ASearchRec.Name                  <> '.')        then
      begin
        While CompareText(ToBeFound, ASearchRec.Name) = 0 do
        begin
          Unit1.Form1.ListBox1.Items.Add(BuildFileName(Path, ASearchRec.Name));
          Result := BuildFileName(Path, ASearchRec.Name);
          Break;
        end;
        FindPath(ToBeFound, BuildFileName(Path, ASearchRec.Name));
      end;
    until FindNext(ASearchRec) <> 0;
    FindClose(ASearchRec);
  end;
end;
Die Testausgabe zeigt mir sogar an den Pfad des gefundenen Pfades jedoch
speichert er es nicht in Result und hört auch nicht auf zu suchen.

BuildFileName ist eine procedure von mir die Dateistrings zusammenfügt und
darauf aufpasst das keine doppelten \ oder so entstehen diese läuft 100%tig.

Wäre echt cool wenn ihr den Fehler findet.

Greetz
Master_BB

rantanplan99 17. Jul 2004 16:41

Re: Fehler im Verzeichnis suchen Algo
 
welchen Sinn macht denn deine While-Schleife? Ersetz mal das While durch ein If und probiers damit aus.

und dann ergänze deinen FindPath Aufruf folgendermasen:

Delphi-Quellcode:
Result := FindPath(ToBeFound, BuildFileName(Path, ASearchRec.Name));
Ich habs allerdings nicht ausprobiert ob es geht, aber es sollte.

Master_BB 17. Jul 2004 16:50

Re: Fehler im Verzeichnis suchen Algo
 
ob da nun while oder if steht ist suppe
while benutzte ich da das dann kürzer ist hier mit if

wo soll ich die zeile nocheinmal reinbauen?

Delphi-Quellcode:
function FindPath(ToBeFound, Path : string) : string;
var
  ASearchRec : TSearchRec;
begin
  Result   := '';

  if Path[Length(Path)] <> '\' then
    Path := Path + '\';

  if FindFirst(Path + '*.*', faDirectory, ASearchRec) = 0 then
  begin
    repeat
      if ((ASearchRec.Attr and faDirectory) = faDirectory) and
         (ASearchRec.Name                  <> '..')       and
         (ASearchRec.Name                  <> '.')        then
      begin
        if CompareText(ToBeFound, ASearchRec.Name) = 0 then
        begin
          Unit1.Form1.ListBox1.Items.Add(BuildFileName(Path, ASearchRec.Name));
          Result := BuildFileName(Path, ASearchRec.Name);
          Break;
        end
        else
        begin
          FindPath(ToBeFound, BuildFileName(Path, ASearchRec.Name));
        end;    
      end;
    until FindNext(ASearchRec) <> 0;
    FindClose(ASearchRec);
  end;
end;

rantanplan99 17. Jul 2004 16:58

Re: Fehler im Verzeichnis suchen Algo
 
If und While ist nicht Suppe in diesem Fall wegen dem Break

weil mit While wird bei Break nur die While schleife abgebrochen und es wird weitergesucht. Bei einem If unterbricht Break die repeat schleife, und die willst du ja unterbrechen.

Und was ich vorhin vergessen habe, nach dem FindPath sollte auch ein Break stehen was Result <> '' ist.

Delphi-Quellcode:
function FindPath(ToBeFound, Path : string) : string;
var
  ASearchRec : TSearchRec;
begin
  Result   := '';

  if Path[Length(Path)] <> '\' then
    Path := Path + '\';

  if FindFirst(Path + '*.*', faDirectory, ASearchRec) = 0 then
  begin
    repeat
      if ((ASearchRec.Attr and faDirectory) = faDirectory) and
         (ASearchRec.Name                  <> '..')       and
         (ASearchRec.Name                  <> '.')        then
      begin
        if CompareText(ToBeFound, ASearchRec.Name) = 0 then
        begin
          Unit1.Form1.ListBox1.Items.Add(BuildFileName(Path, ASearchRec.Name));
          Result := BuildFileName(Path, ASearchRec.Name);
          Break;
        end
        else
        begin
          Result := FindPath(ToBeFound, BuildFileName(Path, ASearchRec.Name));
          if Result <> '' then Break;
        end;    
      end;
    until FindNext(ASearchRec) <> 0;
    FindClose(ASearchRec);
  end;
end;

Master_BB 17. Jul 2004 17:04

Re: Fehler im Verzeichnis suchen Algo
 
das problem bleibt dennoch
und zwar füllt er Result nicht wenn das gesuchte Verzeichnis ein unterverzeichnis ist.
in der testausgabe gibt es es aus aber es wird nicht in result gespeichert

rantanplan99 17. Jul 2004 17:17

Re: Fehler im Verzeichnis suchen Algo
 
Hm, kann ich jetzt nicht nachvollziehen. Ich hab solgendes Ausprobiert: (natürlich die BuildFileName(., .) durch ein einfach . + . ersetzt)


Delphi-Quellcode:
function FindPath(ToBeFound, Path : string) : string;
var
  ASearchRec : TSearchRec;
begin
  Result   := '';

  if Path[Length(Path)] <> '\' then Path := Path + '\';

  if FindFirst(Path + '*.*', faDirectory, ASearchRec) = 0 then
  begin
    repeat
      if ((ASearchRec.Attr and faDirectory) = faDirectory) and
         (ASearchRec.Name                  <> '..')       and
         (ASearchRec.Name                  <> '.')        then
      begin
        if CompareText(ToBeFound, ASearchRec.Name) = 0 then
        begin
          Form1.ListBox1.Items.Add(Path + ASearchRec.Name);
          Result := Path + ASearchRec.Name;
          Break;
        end
        else
        begin
          Result := FindPath(ToBeFound, Path+ ASearchRec.Name);
          if Result <> '' then Break;
        end;
      end;
    until FindNext(ASearchRec) <> 0;
    FindClose(ASearchRec);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(findpath('HTML', 'c:\'));
end;
Zurückgeliefert wird bei mir dann
c:\cygwin\usr\doc\libxml2-2.4.23\html
und das ist ein unterverzeichnis bei mir.

evtl liegt dein Fehler in der BuildFilePath Funktion? Die konnte ich leider nicht testen

Master_BB 17. Jul 2004 17:20

Re: Fehler im Verzeichnis suchen Algo
 
hm buildfilename hatte bei mir noch nie fehler gemacht
Delphi-Quellcode:
function BuildFileName(ADir, AFileName : string) : string;
begin
  if ADir[Length(ADir)] <> '\' then
    ADir := ADir + '\';

  if AFileName[1] = '\' then
    Delete(AFileName,1,1);

  if AFileName[Length(AFileName)] = '\' then
    Delete(AFileName,Length(AFileName),1);

  Result := ADir + AFileName;
end;
und im programm hatte ich es auhc schon einige male raus gemacht und gekukt.


HM WASN DAS?
Jetzt hab ich ein neues projekt mit deinem bzw meinem von dir modifizierten code
gemacht und da klappts
Warum klappts nicht wenn die funktion in meiner Unit ist?

rantanplan99 17. Jul 2004 17:26

Re: Fehler im Verzeichnis suchen Algo
 
Bei mir funktioniert es auch mit der BuildFileName Funktion einwandfrei. Sorry, bei mir macht die Funktion keinen Fehler. Ich weiss leider nicht wieso sie bei dir nicht funktioniert. Kann die da nicht weiterhelfen

Master_BB 17. Jul 2004 17:29

Re: Fehler im Verzeichnis suchen Algo
 
ne du hast mir geholfen deine Version meiner Funktions funktioniert
jetzt hab ich deine in meine Unit kopiert und es funktioniert ebenfals
DAS IST JA VOLL PSYDO warum wollte meine nicht


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