Einzelnen Beitrag anzeigen

Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#1

recursive Dateisuche -> Algorythmusfragen

  Alt 4. Nov 2004, 13:35
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!
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat