Своим опытом делится Олег Кулабухов:
Учтите, что рекурсия занимает много памяти, поэтому подразумевается, что вы не будете использовать пример в чистом виде, а будете выгружать результат в файл или еще куда-нибудь, поскольку существует ограничение на количество пунктов, помещаемых в 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]