CopyFile no Delphi: Como copiar arquivos

Veja neste artigo como utilizar a função CopyFile no Delphi para copiar arquivos entre diretórios do sistema operacional.

Motivação

Copiar arquivos entre pastas do sistema operacional é uma necessidade comum em aplicações desktop. Alguns exemplos são as cópias de arquivos de log e backup, que normalmente precisam ser armazenados em locais diferentes após serem gerados.

No Delphi, essa tarefa pode ser realizada facilmente por meio da função CopyFile, com a qual podemos copiar arquivos ou renomeá-los. Nesse artigo, veremos como utilizar essa função.

Sintaxe

A função CopyFile está presente na unit Windows que, portanto, precisa ser importada na cláusula uses da unit em que desejamos utilizar essa função. Sua estrutura é bastante simples e requer a passagem de apenas três parâmetros, como vemos a seguir:

Function CopyFile(lpExistingFileName: PWideChar; lpNewFileName: PWideChar; bFailIfExists: LongBool): LongBool;
  • lpExistingFileName: Caminho do arquivo a ser copiado;
  • lpNewFileName: Caminho do novo arquivo de destino;
  • bFailIfExists: Parâmetro do tipo boolean que define se o processo de cópia deve ser interrompido e uma falha apresentada caso o arquivo de destino já exista (valor True). Caso seja passado o valor False, o arquivo de destino será sobrescrito, caso exista.

Criando o exemplo

A forma mais simples de uso da função CopyFile é passar diretamente, na forma de strings, os caminhos de origem e destino do arquivo a ser copiado. Na Listagem 1 temos um exemplo dessa possibilidade, na qual passamos ainda o último argumento como True, indicando que o processo deve falhar caso o arquivo de destino já exista. Nesse caso, a função retornará False como resultado e uma mensagem de erro será exibida por meio de um ShowAlert.

01 procedure TFrmPrincipal.BtnCopiarClick(Sender: TObject); 02 begin 03 if CopyFile('C:\Pasta_Original\teste.txt', 'C:\Pasta_Destino\teste.txt', True) then 04 ShowMessage('Arquivo copiado com sucesso') 05 else 06 ShowMessage('#Atenção# - Problema ao copiar o arquivo.'); 07 end;
Listagem 1. Exemplo básico de uso da função CopyFile

Nesse exemplo, passamos o caminho completo dos dois arquivos (origem e destino), no entanto, caso seja necessário, é possível informar apenas o caminho relativo. Dessa forma, a função tomará como base a pasta em que se encontra o arquivo executável da aplicação. Por exemplo, ao informar apenas o nome do arquivo, como ‘teste.txt’, estamos indicando que ele encontra-se no mesmo diretório do executável.

Evoluindo o exemplo

No exemplo anterior, apenas instruímos a aplicação a copiar o arquivo de forma fixa, ou seja, sem avaliar nenhuma condição ou interagir com o usuário. Agora, na Listagem 2, temos uma sugestão de evolução desse exemplo, na qual verificamos, antes da cópia, se os arquivos já existem.

01 procedure TFrmPrincipal.BtnCopiarClick(Sender: TObject); 02 const 03 Arq_Original = 'C:\Pasta_Original\teste.txt'; 04 Arq_Destino = 'C:\Pasta_Destino\teste.txt'; 05 begin 06 if FileExists(Arq_Original) then 07 begin 08 if not FileExists(Arq_Destino) then 09 begin 10 if CopyFile(Arq_Original, Arq_Destino, True) then 11 ShowMessage('Arquivo de destino existe e foi criada uma cópia com sucesso.') 12 end 13 else 14 begin 15 if MessageDlg('Foi encontrado um arquivo com o mesmo nome, deseja substituir o arquivo?', mtConfirmation,[mbyes,mbno],0)=mryes then 16 begin 17 if CopyFile(Arq_Original, Arq_Destino, False) then 18 ShowMessage('Arquivo substituído com sucesso.') 19 end 20 else 21 ShowMessage('#Atenção# - Cópia não realizada.'); 22 end; 23 end; 24 end;
Listagem 2. Exemplo com parametrização

Linhas 03 e 04: Definição do nome dos arquivos de origem e destino;

Linha 06: Verificamos se o arquivo de origem existe. Para isso, utilizamos a função FileExists, presente na unit SysUtils, e que tem como objetivo validar se o arquivo informado existe ou não;

Linha 08: Verificamos se o arquivo de destino não existe;

Linhas 10 e 11: Caso o arquivo de origem exista, e o de destino não, efetuamos a cópia passando o parâmetro bFailIfExists como True. Na sequência, uma mensagem de sucesso é exibida (linha 11);

Linhas 15 a 18: Usamos a função MessageDlg para solicitar ao usuário que escolha o que será feito caso o arquivo exista. Caso seja escolhido “Yes”, a linha 17 será executada com o parâmetro bFailIfExists como False, a fim de substituir o arquivo que já existe no diretório de destino. Em seguida, a linha 18 será executada, apresentando uma mensagem para o usuário;

Linhas 20 e 21: Caso o usuário não tenha clicado em “Yes”, uma mensagem será exibida, avisando que o arquivo não foi copiado.

Como visto, as possibilidades de uso da função CopyFile são diversas e dependerá apenas da necessidade de cada aplicação. Podemos utilizá-la, por exemplo, para renomear um arquivo. Para isso, basta passarmos como segundo argumento o caminho do arquivo de destino apontando para a mesma pasta do arquivo de origem, alterando apenas o seu nome.

Artigos relacionados