![]() |
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; |
AW: Findfirst, Findnext geschachtelt?
Was spricht gegen den Code aus dem Forum?
|
AW: Findfirst, Findnext geschachtelt?
Zitat:
|
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.
|
AW: Findfirst, Findnext geschachtelt?
Delphi-Quellcode:
Nachdem du meinen Kommentaren Glauben schenkst, wirds bestimmt funktionieren ;)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; 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; |
AW: Findfirst, Findnext geschachtelt?
Zitat:
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 23:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz