Копирование директории рекурсивно с файлами.
Адаптированный под Lazarus вариант
Дополнение от Падре Мортиуса Padre_Mortius http://freepascal.ru/forum/viewtopic.php?f=35&t=5013
function FullDirectoryCopy(SourceDir, TargetDir: string; StopIfNotAllCopied, OverWriteFiles: Boolean): Boolean;
var
  SR: TSearchRec;
  I: Integer;
begin
  Result := False;
  SourceDir := IncludeTrailingBackslash(SourceDir);
  TargetDir := IncludeTrailingBackslash(TargetDir);
  if not DirectoryExistsUTF8(SourceDir) then
    Exit;
  if not ForceDirectoriesUTF8(TargetDir) then Exit;
  I := FindFirstUTF8(SourceDir + '*', faAnyFile, SR);
  try
    while I = 0 do
    begin
      if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
      begin
        if SR.Attr and faDirectory = faDirectory then
          Result := FullDirectoryCopy(SourceDir + SR.Name, TargetDir + SR.NAME, StopIfNotAllCopied, OverWriteFiles)
        else
          if not (not OverWriteFiles and FileExistsUTF8(TargetDir + SR.Name))
          then
            Result := CopyFile((SourceDir + SR.Name), (TargetDir + SR.Name), False)
        else
          Result := True;
        if not Result and StopIfNotAllCopied then exit;
      end;
      I := FindNextUTF8(SR);
    end;
  finally
    SysUtils.FindClose(SR);
  end;
end;
Удаление содержимого директории
procedure RemoveAllFilesInDir(path, mask: string;OnlyInRoot:boolean);
var
  sr: TSearchRec;
begin
  if FindFirstUTF8(path + DirectorySeparator + mask, faAnyFile, sr) = 0 then
  begin
    repeat
      if sr.Attr and faDirectory = 0 then
      begin
        DeleteFileUTF8(path + DirectorySeparator + sr.Name);
      end
      else
      begin
        if not OnlyInRoot then
          if pos('.', sr.Name) <= 0 then RemoveAllFilesInDir(path + DirectorySeparator + sr.Name, mask,OnlyInRoot);
        DeleteDirectory(path + DirectorySeparator + sr.Name,false);
      end;
    until FindNext(sr) <> 0;
  end;
  FindClose(sr);
end;
			
		

