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;
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;
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.