Советы по Delphi


Как сделать рекурсию директорий и файлов?


Своим опытом делится Олег Кулабухов:

Учтите, что рекурсия занимает много памяти, поэтому подразумевается, что вы не будете использовать пример в чистом виде, а будете выгружать результат в файл или еще куда-нибудь, поскольку существует ограничение на количество пунктов, помещаемых в ListBox и ему подобных компонентов.

    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;

[001901]



Содержание раздела