![]() |
recursive Dateisuche -> Algorythmusfragen
hallo leute!
ich hab mir im netz ein bisschen code besorgt und etwas angepasst. habe mir auch die snipsel von lucky in der codelib angeschaut, komme aber einfach nich hinter die logik des Algorythmus. hoffe ihr koennt mir da helfen. hier ist erstmal der code. Aenderungen sind mit sternchen gekennzeichnet. paar kleine Fragen zum code sind kommentiert try und finally bloecke hab ich eingefügt -> nach luckys beispiel code, ist sicherer falls exeption denk ich :).
Delphi-Quellcode:
so jetz zu meiner frage. ich versteh den algorythmus an dieser stelle nicht
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private procedure GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean); { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; filecount,dircount,x,y:integer; start:string[255]; sr:tsearchrec; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin GetFilesInDirectory('C:\test\','*.*',Listbox1.Items,true); end; //------------------------------------------------------------------------------------------ procedure Tform1.GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean); var SR: TSearchRec; begin if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then ADirectory:=ADirectory+'\'; if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0) then try // ** eingefügt repeat if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then label1.caption:= ADirectory+SR.Name; // warum kein begin AList.Add(ADirectory+SR.Name) // end block und kein abschlusssemikolon??? until FindNext(SR)<>0; finally //** eingefügt FindClose(SR); end; //ist das end ohne begin überfluessig, wo ist der bezug? if ARekursiv then if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then try //** eingefügt repeat if (SR.Name<>'.') and (SR.Name<>'..') then GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True); until FindNext(SR)<>0; finally //** eingefügt FindClose(SR); end; //ist das end ohne begin überfluessig, wo ist der bezug? end; //---------- ab hier is bloedsinn-------------------------------------------------- procedure TForm1.FormCreate(Sender: TObject); begin start:='C:\'; dircount:=0; filecount:=0; x:=20; y:=20; end; end.
Delphi-Quellcode:
-> suche in c:\
c:\
test1 ---------------------------------------------------- bla test2 ------------------------------ tester - muell.txt test3 ---- hastenichgesehn - hallo - bla2.hastenichgesehn - test4 - kacke -> finde directory test1 -> recursiver aufruf -> suche in c:\test1 -> finde directory bla -> recursiver aufruf -> suche in c:\test1\bla -> keine directorys! -> liste enthaltene dateien -> muell.txt, bla2.hastenichgesehn -> setzte rootpfad zurüeck auf 'c:\' //denkfehler hier :wall: -> recursiver aufruf soweit alles klar! aber wenn ich jetz recursiv aufrufe sucht er wieder in 'c:\' und findet er zuerst ja wieder den selben directory zweig (nahmlich test, und ich hab ne tolle endlosschleife) meine problem ist, das ja die direinträge immer in der selben reihenfolge kommen, und ich nicht weis wie ich nach test2 sozusagen weiterschalte das problem tritt ueberall auf, wo sich mehr als 1 unterverzeichnis im aktuellen zweig befindet der obige code funktioniert jedoch, aber ich uebersehe etwas und finde nich die stelle die auf den zweig "test2" umschaltet ich hatte vor ewigen zeiten das gleiche prob mit turbopascal, dort hab ich es super umständlich geloest, über dyn array's und verzeichnisebenen speicherung waere nett wenn mich jemand leutern koennte :) bis denne! |
Re: recursive Dateisuche -> Algorythmusfragen
Delphi-Quellcode:
das end; gehört zu try-finally
try
... Anweisung ... finally ... Anweisung ... end; Zitat:
Zitat:
Delphi-Quellcode:
nachdem er wieder zurückkommt wird mit FindNext der nächste ordner ausgewählt
until FindNext(SR)<>0;
|
Re: recursive Dateisuche -> Algorythmusfragen
HI!
Zu der wiederholten Frage:
Code:
bringt die Hilfe das hier:
FindClose(SR);
end; //ist das end ohne begin überfluessig, wo ist der bezug? if ARekursiv then if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then try //** eingefügt repeat if (SR.Name<>'.') and (SR.Name<>'..') then GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True); until FindNext(SR)<>0; finally //** eingefügt FindClose(SR); end; //ist das end ohne begin überfluessig, wo ist der bezug?
Code:
Reset(F);
try ... // process file F finally CloseFile(F); end; Zitat:
|
Re: recursive Dateisuche -> Algorythmusfragen
ja, ok aber das mit dem algorythmus schnall ich net. was heist ueberhaupt "wenn er zurueckkommt"
dafür muesste er die directorystrucktur doch komplett irgenwo in ein array speichern oder so etwa in der art lies c:\ speichere dirs -> array array index[1]:=dir1 index[2]:=dir2 index[3]:=dir3 if no more dirs then inc(arrayindex); recursiver aufruf, und das für jede verzeichnisebene oder ?? |
Re: recursive Dateisuche -> Algorythmusfragen
Hi,
Mal ausgehend von der Verzeichnisstruktur
Code:
wird der Code folgendermaßen arbeiten:
a
| |_b | | | |_ba | | | |_bb | |_c |_..... 1. Suche alle Dateien in a (FindFirst) 2. Liste alle Files in a nacheinander auf (repeat until FindNext) 3. Falls rekursiv, suche alle Verzeichnisse in a (FindFirst im unteren Abschnitt) 4. Rufe sich selbst für jedes einzelne gefundene Verzeichnis in a nacheinander auf (repeat until FindNext im unteren Abschnitt), d.h. er findet b und sucht nun in b, bis er keine Verz. mehr in b findet, dann arbeitet er in der repeat-Schleife des Codes, der in a sucht, weiter ab (unterer Abschnitt) und findet c .... das heißt, es wird nix auf 'C:\' "zurückgesetzt" oder so, sondern er arbeitet den Code nach dem rekursiven Aufruf weiter ab (nächster Schritt der repeat-Schleife) Ich hoffe das war halbwegs verständlich erklärt :) Gruß Stephan :dance: |
Re: recursive Dateisuche -> Algorythmusfragen
ja,schon, aber wo merkt er sich den status bzw den fortschritt der suche in verzeichnis a, wenn eien anderes findfirst in verzeichnis b sucht???
is dat irgentwie intern geregelt und ich brauch mich da gar nich drum kümmern ?? |
Re: recursive Dateisuche -> Algorythmusfragen
Das wird in der aufrufenden Routine "gespeichert". Die Routine wird ja nicht einfach nochmal von vorne angefangen, sondern (soz. als "eigenständige Routine" neu aufgerufen).
Gruß Stephan :dance: |
Re: recursive Dateisuche -> Algorythmusfragen
angenommen verzeichnissstrucktur
c:\ c:\unterverz er sucht also in C:\ findet "unterverz" und geht mit
Delphi-Quellcode:
in die nächste ebene(c:\unterverz), dort gibt es keine unterverzeichnisse meher --> er läuft bis zum ende der funktion und kehrt an die stelle zurück von der er aufgerufen wurde(also eine ebene höher C:\),
GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True);
also 1 Zeile unterhalb von
Delphi-Quellcode:
da ist nun
GetFilesInDirectory(ADirectory+SR.Name,AMask,AList,True);
Delphi-Quellcode:
--> er sucht nach dem nächsten Verzeichniss in C:\
until FindNext(SR)<>0;
|
Re: recursive Dateisuche -> Algorythmusfragen
ok danke jetz hab ichs kapiert, so wie eine geschachtelte for next schleife ja ???
|
Re: recursive Dateisuche -> Algorythmusfragen
GENAU :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 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