Verzeichnis kopieren

Basic

Well-Known Member
#1
Wenn ich ein Verzeichnis kopieren will, kann ich ja die enthaltenen Dateien mittels findfirst,findnext finden und kopieren. Wenn dieses Verzeichnis aber weitere Verzeichnise beinhaltet, wie kann ich diese herausfinden?

Basic
 

gargyle

Well-Known Member
c-b Experte
#2
Code:
// Recursive procedure to build a list of files
procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string);
var
  SR: TSearchRec;
  DirList: TStringList;
  IsFound: Boolean;
  i: integer;
begin
  if StartDir[length(StartDir)] <> '\' then
    StartDir := StartDir + '\';

  { Build a list of the files in directory StartDir
     (not the directories!)                         }

  IsFound :=
    FindFirst(StartDir+FileMask, faAnyFile-faDirectory, SR) = 0;
  while IsFound do begin
    FilesList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;
  FindClose(SR);

  // Build a list of subdirectories
  DirList := TStringList.Create;
  IsFound := FindFirst(StartDir+'*.*', faAnyFile, SR) = 0;
  while IsFound do begin
    if ((SR.Attr and faDirectory) <> 0) and
         (SR.Name[1] <> '.') then
      DirList.Add(StartDir + SR.Name);
    IsFound := FindNext(SR) = 0;
  end;
  FindClose(SR);

  // Scan the list of subdirectories
  for i := 0 to DirList.Count - 1 do
    FindFiles(FilesList, DirList[i], FileMask);

  DirList.Free;
end;

// Example: how to use FindFiles
procedure TForm1.ButtonFindClick(Sender: TObject);
var
  FilesList: TStringList;
begin
  FilesList := TStringList.Create;
  try
    FindFiles(FilesList, EditStartDir.Text, EditFileMask.Text);
    ListBox1.Items.Assign(FilesList);
    LabelCount.Caption := 'Files found: ' + IntToStr(FilesList.Count);
  finally 
    FilesList.Free;
  end;
end;
 
Oben