FAQ » Pliki

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

{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 komentarze

hugio 2005-08-14 14:11

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 ?

jozkan 2004-07-30 19:14

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???

bedek 2004-07-30 14:56

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