Jak rekurencyjnie znaleźć wszystkie pliki i foldery w danym folderze

jozkan
{Procedura FoldersAndFilesInFolder podaje sciezki wszystkich folderów i plików (jak również podfolderów, a w szczególnym przypadku całą strukturę dysku) znajdujących się w foderze okreslonym scieżką dir_path. Na formie jest Memo i Button dla przetestowania procedury}
{Uwaga: Wskutek błędu mojego lub autorów strony nie są wyświetlane ukośniki występujące w ścieżkach, dlatego zastąpiłem je słowem 'ukosnik'}

type
   Tdirs_path =array of string;
   Tfiles_path=array of string;

  Tdir=record
       dir_path:string;{scieżka folderu}
       dirs_path:Tdirs_path;{scieżki folderów znajdujących się w tym folderze}
       files_path:Tfiles_path;{sciezki plików znajdujących się w tym folderze}
       end;
  Tdirs=array of Tdir;{fodery w naszym folderze, nr 0 - nasz folder}


var
  Form1: TForm1;


procedure FoldersAndFilesInFolder(dir_path:string;var dirs:Tdirs);


implementation

{$R *.DFM}

procedure FoldersAndFilesInFolder(dir_path:string;var dirs:Tdirs);
var
   dirs_path1:Tdirs_path;
   files_path1:Tfiles_path;
   start:Integer;

   {pliki}
   procedure FilesP(dir_path:string;var files_path:Tfiles_path);
   var
      info_f:TSearchRec;
      ok_f,count_f:Integer;

      procedure AddFileP;{dodaj scieżkę pliku}
      begin
         Inc(count_f);
         SetLength(files_path,count_f);
         files_path[count_f-1]:=dir_path+'ukosnik'+info_f.name;
      end;

   begin
      count_f:=0;
      ok_f:=FindFirst(dir_path + 'ukosnik*.*' , faAnyFile,info_f);
      if ok_f=0 then
      begin
         if ((info_f.Attr and faDirectory)=0) then
         AddFileP;
         repeat
            ok_f:=FindNext(info_f);
            if (ok_f=0)and((info_f.Attr and faDirectory)=0) then
            AddFileP;
         until ok_f<>0;
      end;
      FindClose(info_f);
   end;

   {foldery}
   procedure DirsP(dir_path:string;var dirs_path:Tdirs_path);
   var
      info_d:TSearchRec;
      ok_d,count_d:Integer;

      procedure AddDirP;{dodaj scieżkę folderu}
      begin
         Inc(count_d);
         SetLength(dirs_path,count_d);
         dirs_path[count_d-1]:=dir_path+'ukosnik'+info_d.name;
      end;

   begin
      count_d:=0;
      ok_d:=FindFirst(dir_path+'ukosnik*',faDirectory,info_d);
      if ok_d=0 then
      begin
         if ((info_d.Attr and faDirectory)=faDirectory)and
            ((info_d.name<>'.')and(info_d.name <> '..')) then
         AddDirP;
         repeat
            ok_d:=FindNext(info_d);
            if ok_d=0 then
            begin
               if ((info_d.Attr and faDirectory)=faDirectory)and
                  ((info_d.name<>'.')and(info_d.name <> '..')) then
               AddDirP;
            end;
         until ok_d<>0;
      end;
      FindClose(info_d);
   end;

   procedure FoldersAndFilesInFolderEx(dir_path:string;var nr_dir:Integer;var dirs:Tdirs);
   var
      d:Integer;
   begin
      SetLength(dirs_path1,0);
      SetLength(files_path1,0);
      DirsP(dir_path,dirs_path1);
      FilesP(dir_path,files_path1);
      SetLength(dirs,nr_dir+1);
      dirs[nr_dir].dir_path:=dir_path;
      dirs[nr_dir].dirs_path:=dirs_path1;
      dirs[nr_dir].files_path:=files_path1;
      Inc(nr_dir);
      if Length(dirs_path1)&gt;0 then
      begin {wywolanie rekurencyjne}
         for d:=0 to High(dirs_path1) do
         FoldersAndFilesInFolderEx(dirs_path1[d],nr_dir,dirs);
      end;
   end;

begin
   start:=0;
   FoldersAndFilesInFolderEx(dir_path,start,dirs);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
   dirs:Tdirs;
   ds,d,f:Integer;
begin
   Memo1.Clear;
   {przykładowy folder}  
   FoldersAndFilesInFolder('C:ukosnik Windows ukosnik Pulpit ukosnik Nowy',dirs);

   for ds:=0 to High(dirs)do
   begin
      Memo1.Lines.Add(dirs[ds].dir_path);
      for d:=0 to High(dirs[ds].dirs_path) do
      Memo1.Lines.Add('     folder nr '+IntToStr(d+1)+'  '+dirs[ds].dirs_path[d]);
      for f:=0 to High(dirs[ds].files_path) do
      Memo1.Lines.Add('     plik nr '+IntToStr(f+1)+'  '+dirs[ds].files_path[f]);
   end;
end;

3 komentarzy

hehe bedek ujełes to bardzo prosto ale to jest najprostsze wyjscie i zarazem cienkie bo co jesli chcesz aby pokazywało ci pliki znajdujace sie w pod folderach czyli czała strukture katalogu na WINDOWS .Takie rozwiazanie pokaze ci tylko to co sie znajduje w folderze windows ale nie juz co sie kryja za pliku system32 ?

Zwróć uwagę na to że jedna procedurka FoldersAndFilesInFolder(dir_path:string;var dirs:Tdirs); daje całą strukturę katalogu - scieżki wszystkich podkatalogów i plików więc po co się bawić w dodatkowe komponenty???

Po co tyle zachodu nie prościej tak:

// Plik jest komponentem TFileListBox z zakladki Win 3.1
Pliki.Drive := 'C'; // litera dysku
Pliki.Directory := 'windows\media'; // katalog
Pliki.FileType := [ftNormal]; // typy plików - tutaj tylko pliki bez atrybutów
...
Pliki.FileType := [ftDirectory]; // tylko katalogi
// inne dostępne opcje: [ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftArchive]
// liczba plików na liscie: Pliki.Items.Count
// dostęp do nazwy czwartego pliku na liscie: Pliki.Items.Strings[3]

Działa na wszystkich windach