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:
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.
so jetz zu meiner frage. ich versteh den algorythmus an dieser stelle nicht
Delphi-Quellcode:
c:\
test1 ---------------------------------------------------- bla
test2 ------------------------------ tester - muell.txt
test3 ---- hastenichgesehn - hallo - bla2.hastenichgesehn
- test4 - kacke
-> suche in c:\
-> 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
-> 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!