Neste artigo,irei compartilhar o código fonte de uma procedure que visa copiar a estrutura de pastas de forma personalizável no diretório destino. O Código irá percorrer a estrutura de arquivos da pasta selecionada utilizando os comandos: FINDFIRST e FINDNEXT.
Essas funções retornam 0 quando encontram um arquivo ou pasta;
Para verificar se é um outro diretório devemos checar se o atributo do arquivo é igual a 16. Então adicionaremos o caminho do diretório em uma stringlist para depois copiar seus arquivos.
procedure TfrmTeste.CopyFiles(DirOrigem, DirDest: string);
var
Arquivos: TSearchRec;
Encontrou: Integer;
str : TStringList;
i : integer;
CriaDir : String;
begin
str := TStringList.Create;
str.Add(DirOrigem);
i := 0;
while i <= str.count -1 do
begin
CriarDir := StringReplace(strList[i], DirOrigem, '
',[rfReplaceAll, rfIgnoreCase]);
if not DirectoryExists(DirDest + CriarDir ) then
{No caso as estruturas de pastas serão iguais logo
iremos verificar se a pasta existe o destino}
ForceDirectories(DirDest + CriarDir );
SetCurrentDir(DirOrigem + CriarDir);
Encontrou := FindFirst('*', faAnyFile , Arquivos);
{Atrr 16 corresponde a pasta, e 32 a arquivos}
while Encontrou = 0 do
begin
if (Arquivos.attr = 16) then {Verifica se é pasta}
str.Add(DirOrigem + Arquivos.Name + '\') {Adiciona a
StringList para procura de arquivos}
else
CopyFile(Pchar(DirOrigem + Arquivos.Name),
PChar(DirDest + Arquivos.Name), True);
{Coloque como True se quiser que se já existir o
arquivo ele seja sobrescrito }
SetFileAttributes(PChar(DirDest + Arquivos.Name),
FILE_ATTRIBUTE_NORMAL); {Tira a propriedade READ - ONLY do arquivo}
Encontrou := FindNext(Arquivos);
end;
FindClose(Arquivos);
Inc(i,1); {Incrementa o contador}
end;
end;