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.