Sexta-feira, Fevereiro 11, 2005

Copiando uma pasta com subdiretórios no Delphi

Um leitor do blog perguntou como copiar uma pasta com subdiretórios no Delphi. Temos diversas maneiras de fazer isso:


  • Usando a Api do Windows

  • Usando funções do Delphi


Nesta postagem, iremos ver a maneira fácil de fazer isso: com a Api do Windows. A outra maneira fica para uma outra postagem.
Para copiar um diretório e suas subpastas usando a Api do Windows, usamos a função ShFileOperation, definida em ShellApi.pas. Ela recebe apenas um parâmetro, do tipo TShFileOpStruct, uma estrutura contendo as informações de cópia (na realidade, esta função permite também outras operações de arquivos, como exclusão ou movimentação). Basta preencher a estrutura e chamar a função. Assim, poderíamos criar uma função CopiaDirs assim:

function CopiaDirs(DirFonte,DirDest : String) : Boolean;
var
ShFileOpStruct : TShFileOpStruct;
begin
Result := False;
if DirFonte = '' then
raise Exception.Create(
'Diretório fonte não pode ficar em branco');
if DirDest = '' then
raise Exception.Create(
'Diretório destino não pode ficar em branco');
if not DirectoryExists(DirFonte) then
raise Exception.Create('Diretório fonte inexistente');
DirFonte := DirFonte+#0;
DirDest := DirDest+#0;
FillChar(ShFileOpStruct,Sizeof(TShFileOpStruct),0);
with ShFileOpStruct do begin
Wnd := Application.Handle;
wFunc := FO_COPY;
pFrom := PChar(DirFonte);
pTo := PChar(DirDest);
fFlags := FOF_ALLOWUNDO or FOF_SIMPLEPROGRESS or
FOF_NOCONFIRMATION;
end;
ShFileOperation(ShFileOpStruct);
end;

Esta função copia um diretório e seus subdiretórios para o diretório de destino

8 Comentários:

At 4:33 PM, Anonymous Anônimo disse...

Duas coisas:

1: if not DirectoryExists(DirFonte) then //aqui diz o seguinte """[Error] Unit1.pas(31): Undeclared identifier: 'DirectoryExists'"""

2: Como eu chamo essa função em um botão por exemplo?

 
At 2:35 PM, Anonymous Renan Takeshi disse...

muito bom cara..

 
At 4:01 PM, Blogger Bruno disse...

1. Inclua a unit SysUtils na cláusula Uses

2.Coloque a chamada no manipulador do evento OnClick.

 
At 11:36 AM, Anonymous Joao disse...

Mesmo colocando essa unit SysUtils
da a msg de q nao existe essa USES.

Gostaria dessa ajuda muito, se puder envie-me um email para
joaomarcio@cardiesel.com.br


obrigado

 
At 11:46 AM, Anonymous Joao disse...

Pesquisei e consegui, a uses eh a ShellAPI.

Agora deu...valew ae

 
At 9:46 PM, Anonymous Edicarlos disse...

Muito Bom, Obrigado, A Verdade é quem procura acha!

 
At 10:37 AM, Anonymous Anônimo disse...

voce tem q colocar ShellApi na clausula Uses

 
At 4:22 PM, Anonymous Anônimo disse...

Aprendi muito

 

Postar um comentário

<< Home