Главная страница | назад





Article #17784: How do I recurse sub directories?

 Question and Answer Database

FAQ2784D.txt   How do I recurse sub directories?
Category   :Object Pascal
Platform    :All
Product    :All 32 bit  

Question:
How do I recurse sub directories?

Answer:
You will need to use Delphi's FindFirst() and FindNext() 
procedures to create a list of all the sub directories 
in a directory. For each sub directory, you will need to 
use Delphi's FindFirst() and FindNext() procedures, again 
to add any sub directories of the found directories to the 
list. Continue working down the list until all the 
directories have been processed.

Example:

procedure GetDirectories(const DirStr : string;
                         ListBox : TListBox);
var
  DirInfo: TSearchRec;
  r : Integer;
begin
  r := FindFirst(DirStr + '\*.*', FaDirectory, DirInfo);
  while r = 0 do  begin
    Application.ProcessMessages;
    if ((DirInfo.Attr and FaDirectory = FaDirectory) and
         (DirInfo.Name <> '.') and
         (DirInfo.Name <> '..'))  then
      ListBox.Items.Add(DirStr + '\' + DirInfo.Name);
    r := FindNext(DirInfo);
  end;
  SysUtils.FindClose(DirInfo);
end;

procedure GetFiles(const DirStr : string;
                   ListBox : TListBox);
var
  DirInfo: TSearchRec;
  r : Integer;
begin
  r := FindFirst(DirStr + '\*.*', FaAnyfile, DirInfo);
  while r = 0 do  begin
    Application.ProcessMessages;
    if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
        (DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
      ListBox.Items.Add(DirStr + '\' + DirInfo.Name);
    r := FindNext(DirInfo);
  end;
  SysUtils.FindClose(DirInfo);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i : integer;
begin
  ListBox1.Items.Clear;
  ListBox2.Items.Clear;
  ListBox1.Items.Add('C:\Delphi');
  GetDirectories('C:\Delphi', ListBox1);
  i := 1;
  while i < ListBox1.Items.Count do begin
    GetDirectories(ListBox1.Items[i], ListBox1);
    Inc(i);
  end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  ListBox2.Clear;
  GetFiles(ListBox1.Items[ListBox1.ItemIndex],
           ListBox2);
end;

Note: Recursing directories can take up a lot of memory. 
It is suggested that you consider creating a linked list 
or a temporary file to store your list entries instead 
of using a component (such as a Memo or StringList), as 
there are limits to the number of entries these components 
can have.

7/16/98 4:31:28 PM
 

Last Modified: 01-SEP-99