Foldery i pliki w folderze rekurencyjnie

0

Nie mogę nic konkretnego znaleźć na ten temat. Już z definicją mam problemy:
//do znajdowania plikow i folderow w danym folderze
Tdir=record
dir_path:string;
files_path:array of string;
dirs:array of Tdir;//nie przechodzi
end;
Toż to musi być proste, tylko nie mam pomysła więc proszę nie mówcie że to proste albo że było x razy tylko dajcie jakąś wskazówkę

Zmiana planu:
Tdir=record
dir_path:string;
files_path:array of string;
dirs_path:array of string;
end;
Tdirs=array of Tdir;
FindFirst i FindNext pliki i foldery bez rekurencji - dobry kierunek?

0

Z tego co się orientuję to nie można przypisać zmiennej typu rekordowego w deklaracji tego rekordu :| zatem ten pierwszy sposób odpada. rekurencja dopiero, jak sam dobrze zauważyłeś, dopiero później w procudurze wyszukiwania plików, czyli z findFirst i FindNext, a to na pewno jest opisane w jakimś artykule.

0

A dlaczego np FindFirst('R*',faDirectory,info) znajduje mi również pliki zaczynające się na R, a FindFirst('.',faAnyFile,info) również katalogi?

0

A dlaczego np FindFirst('R*',faDirectory,info) znajduje mi również pliki zaczynające się na R, a FindFirst('.',faAnyFile,info) również katalogi?

Taki maly blad, ktory zazwyczaj sie likwiduje sprawdzajac info po wykonaniu Find*

0

Zajrzyj do algorytmów (rekurencja)

if ((SR.Attr and faDirectory) = faDirectory) and ((SR.Name <> '.') and (SR.Name <> '..')) then // to jest katalog

if ((SR.Attr and faDirectory) = 0) then // to jest plik
0

No i coś wykombinowałem - dzięki za pomoc

{
Procedura FoldersAndFilesInFolder podaje sciezki wszystkich folderów i plików
znajdujących się w foderze okreslonym scieżką dir_path. Na formie jest Memo i Button dla przetestowania procedury
}
   Tdirs_path =array of string;
   Tfiles_path=array of string;

  Tdir=record
       dir_path:string;//scieżka foldeu
       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;


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+'\\'+info_f.name;
      end;

   begin
      count_f:=0;
      ok_f:=FindFirst(dir_path+'\\*.*',faArchive,info_f);
      if ok_f=0 then
      begin
         AddFileP;
         repeat
            ok_f:=FindNext(info_f);
            if ok_f=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+'\\'+info_d.name;
      end;

   begin
      count_d:=0;
      ok_d:=FindFirst(dir_path+'\\*',faAnyFile,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)>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;
   FoldersAndFilesInFolder('C:\\Windows\\Pulpit\\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;

1 użytkowników online, w tym zalogowanych: 0, gości: 1