Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Findfirst, Findnext geschachtelt? (https://www.delphipraxis.net/153185-findfirst-findnext-geschachtelt.html)

zeras 23. Jul 2010 19:45

Findfirst, Findnext geschachtelt?
 
Ich möchte in Pfaden nach weiteren Pfaden suchen und nutze folgenden Code, aber es kommt nicht das Ergebnis raus, was ich eigentlich erwarte. Geht eigentlich ein Verschachteln von Findfirst/Findnext/Findclose?

Aufbau der Pfade wie folgt:

d:\xxxx\yyyyyyyy\*.*

Mit der äußeren Schleife wollte ich die Pfade in der Art xxxx durchsuchen und wenn ich auf einen solchen gestoßen bin, dann in der inneren Schleife dann nach yyyyyyyyy suchen.
Oder habe ich da einen Denkfehler?


Delphi-Quellcode:

      DirPrdGroup:=AddBackSlash(Dir);

      if SysUtils.FindFirst(DirPrdGroup + '*.*', SysUtils.faDirectory, SR) = 0 then try
        repeat
          if ((SR.attr and faDirectory) = faDirectory) and
             (SR.Name <> '.') and (SR.Name <> '..') then


            DirManuGroup:=AddBackSlash(DirPrdGroup + SR.Name);
            if SysUtils.FindFirst(DirManuGroup + '*.*', SysUtils.faDirectory, SR2) = 0 then try
              repeat
                if ((SR2.attr and faDirectory) = faDirectory)
                and (length(SR2.Name)=8)
                and (SR2.Name <> '.')
                and (SR2.Name <> '..')
                then

                  IdxRow:=RowCount-1;
                  Cells[0, IdxRow]:=SR2.Name;

                  AddRow; //leere Zeile dranhängen



              until SysUtils.FindNext(SR2) <> 0;
            finally
              FindClose(SR2);
            end;




        until SysUtils.FindNext(SR) <> 0;
      finally
        FindClose(SR);
      end;

Luckie 23. Jul 2010 20:52

AW: Findfirst, Findnext geschachtelt?
 
Was spricht gegen den Code aus dem Forum?

DeddyH 23. Jul 2010 23:02

AW: Findfirst, Findnext geschachtelt?
 
Zitat:

Zitat von zeras (Beitrag 1037173)
Aufbau der Pfade wie folgt:

d:\xxxx\yyyyyyyy\*.

Kannst Du das mal näher erläutern? Sind da Wildcards im Spiel oder sind das fixe Werte? Im letzteren Fall wäre DirectoryExists doch viel einfacher.

alzaimar 24. Jul 2010 03:59

AW: Findfirst, Findnext geschachtelt?
 
Im Prinzip speicherst Du dir für jede Verzeichnisebene einen TSearchRec. Da ein Unterverzeichnis jedoch wieder ein Verzeichnis ist, würde ich das rekursiv lösen.

Aphton 24. Jul 2010 07:23

AW: Findfirst, Findnext geschachtelt?
 
Delphi-Quellcode:

      DirPrdGroup:=AddBackSlash(Dir);

      if SysUtils.FindFirst(DirPrdGroup + '*.*', SysUtils.faDirectory, SR) = 0 then try
        repeat
          if ((SR.attr and faDirectory) = faDirectory) and
             (SR.Name <> '.') and (SR.Name <> '..') then


            DirManuGroup:=AddBackSlash(DirPrdGroup + SR.Name);
{Warnung: WAS WENN DIE VORIGE IF-CONDITION NICHT ERFÜLLT IST? DANN IST DirMainGroup entweder '' oder eben das vorige Verzeichnis...
An deiner Stelle würde ich die Bedingung auch hier gelten lassen (einfach ein begin nach "then" machen und unterhalb der folgenden Routine ein "end"}
            if SysUtils.FindFirst(DirManuGroup + '*.*', SysUtils.faDirectory, SR2) = 0 then try
              repeat
                if ((SR2.attr and faDirectory) = faDirectory)
                and (length(SR2.Name)=8)
                and (SR2.Name <> '.')
                and (SR2.Name <> '..')
                then
{WARNUNG: Hier fehlt wieder mal ein begin}
                  IdxRow:=RowCount-1;
                  Cells[0, IdxRow]:=SR2.Name;

                  AddRow; //leere Zeile dranhängen
{-- und ein end}


              until SysUtils.FindNext(SR2) <> 0;
            finally
              FindClose(SR2);
            end;


        until SysUtils.FindNext(SR) <> 0;
      finally
        FindClose(SR);
      end;
Nachdem du meinen Kommentaren Glauben schenkst, wirds bestimmt funktionieren ;)

Edit: Ich bin mal so großzügug und zeig dir mal die Ausgebsserte und nach meinem Geschmack richtig eingerückte Variante deines Codes:
Delphi-Quellcode:
begin
  DirPrdGroup := AddBackSlash( Directory );
  if SysUtils.FindFirst( DirPrdGroup + '*.*', SysUtils.faDirectory, SR1 ) = 0 then
    try
      repeat
        if ( ( SR1.attr and faDirectory ) = faDirectory ) and
          ( SR1.Name <> '.' ) and ( SR1.Name <> '..' ) then
        begin
          DirManuGroup:=AddBackSlash(DirPrdGroup + SR1.Name);
          if SysUtils.FindFirst( DirManuGroup + '*.*', SysUtils.faDirectory, SR2 ) = 0 then
            try
              repeat
                if ( (SR2.attr and faDirectory) = faDirectory ) and ( length(SR2.Name)=8 ) and
                  ( SR2.Name <> '.' ) and ( SR2.Name <> '..' ) then
                begin
                  Cells[0, RowCount-1]:=SR2.Name;
                  AddRow();
                end;
              until SysUtils.FindNext( SR2 ) <> NO_ERROR;
            finally
              SysUtils.FindClose( SR2 );
            end;
        end;
      until SysUtils.FindNext( SR1 ) <> NO_ERROR;
    finally
      SysUtils.FindClose( SR1 );
    end;
end;

zeras 24. Jul 2010 08:12

AW: Findfirst, Findnext geschachtelt?
 
Zitat:

Zitat von Aphton (Beitrag 1037215)
Delphi-Quellcode:

Edit: Ich bin mal so großzügug und zeig dir mal die Ausgebsserte und nach meinem Geschmack richtig eingerückte Variante deines Codes:

Danke für den verbesserten Code.
Hauptsächlich fehlte das begin end oben. Das wahr wohl das Ausschlaggebende, aber bei meinem Code war der letzte Eintrag doppelt, bei deinem Code korrekt.

Nun geht das erst einmal und ich muss weiter verfeinern.

Wahrscheinloch sollte man Freitag Abend nicht anfangen mit etwas Neuem.


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