Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Cópia de arquivos


Gabriel Cabral

Pergunta

Boa tarde, amigos.

Tenho uma rotina no programa que copia arquivos de uma pasta para outra, de acordo com uma máscara... colocarei esta rotina aqui pra ficar mais claro.

procedure TfrmEstoqPrincipal.mnuBackupClick(Sender: TObject);
var
  PastaOrigem, PastaDestino, Mascara: string;
begin
  PastaOrigem := ExtractFileDir(ParamStr(0))+'\DATABASE\';
  if PastaOrigem = '' then Exit;

  DlgSelPasta.CaptionTitle := 'BACKUP DE ARQUIVOS';
  DlgSelPasta.Caption      := 'ESCOLHA A PASTA DE DESTINO:';

  if DlgSelPasta.Execute then
  begin
    PastaDestino := DlgSelPasta.SelectedFolder;
    if PastaDestino = '' then Exit;

    Mascara := 'E*.DBF';
    if Mascara = '' then Exit;

    CopiaArquivos(PastaOrigem,PastaDestino,Mascara);

    Mascara := 'F*.DBF';
    if Mascara = '' then Exit;

    CopiaArquivos(PastaOrigem,PastaDestino,Mascara);
  end;
end;
////////////////////////////////////////////////////////////////////////////////
/////  EFETUA COPIA DE ARQUIVOS SEGUNDO UMA MASCARA ENTRE ORIGEM E DESTINO  ////
////////////////////////////////////////////////////////////////////////////////
procedure CopiaArquivos (dOrigem, dDestino, dMascara: string);
var
  Dados: TSHFileOpStruct; // procedimento de cópia pelo Shell do Windows
  sSepar: String;
begin

  if dOrigem[Length(dOrigem)]='\' then sSepar:=''
  else sSepar:='\';
  dOrigem:=dOrigem+sSepar;
  
  if dDestino[Length(dDestino)]='\' then sSepar:=''
  else sSepar:='\';
  dDestino:=dDestino+sSepar;
  
  if (dMascara[1]='*') and not (dMascara[2]='.') then
    dMascara:='?'+dMascara;
  
  FillChar(Dados,SizeOf(Dados), 0);       
  
  with Dados do                           
  begin                                 
    wFunc := FO_COPY;                     
    pFrom := PChar(dOrigem+dMascara);     
    pTo := PChar(dDestino);               
    fFlags:= FOF_ALLOWUNDO;               
  end;                                  
  
  SHFileOperation(Dados);               

end;

Pois bem... as máscaras são E*.DBF e F*.DBF porque os arquivos que quero copiar são começados em E e F ....

Existe um outro arquivo, nesta pasta, chamado TABELA.DBF ...

Aí ocorre o seguinte:

Quando coloco a mascara := 'TABELA*.DBF', este arquivo é copiado normalmente...

Mas quando a mascara := 'E*.DBF' ou 'F*.DBF', ocorre o seguinte erro

Não é possível copiar arquivo. Não é possível ler o arquivo ou disco de origem.

O curioso é que isso ocorre em um programa... Mas em um outro programa, eu utilizo essa mesma rotina, sem mudar uma letra sequer, e funciona tudo corretamente.

Declarei ShellAPI nos dois programas... E estou achando que está faltando algum outro detalhe neste programa que não está funcionando.

Alguém sabe me dizer se é preciso alguma outra coisa, além do ShellAPI para esta função de cópia funcionar? Algum detalhe que pode ter passado despercebido por mim?

Muito obrigado.

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var 
  SR: TSearchRec; 
  I: integer; 
  Origem, Destino: string; 
begin 
  I := FindFirst('c:\E*.*', faAnyFile, SR);   // c:\Origem
  while I = 0 do begin 
  if (SR.Attr and faDirectory) <> faDirectory then begin 
  Origem := 'c:\Origem' + SR.Name; 
  Destino := 'c:\Destino' + SR.Name; 
  if not CopyFile(PChar(Origem), PChar(Destino), false) then 
  ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino); 
  end; 
  I := FindNext(SR); 
  end; 
end;
ou
procedure TForm1.Button1Click(Sender: TObject);
var 
  SR: TSearchRec; 
  I: integer; 
  Origem, Destino: string; 
begin 
  I := FindFirst('c:\E*.DBF', faAnyFile, SR);   // c:\Origem
  while I = 0 do begin 
  if (SR.Attr and faDirectory) <> faDirectory then begin 
  Origem := 'c:\Origem' + SR.Name; 
  Destino := 'c:\Destino' + SR.Name; 
  if not CopyFile(PChar(Origem), PChar(Destino), false) then 
  ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino); 
  end; 
  I := FindNext(SR); 
  end; 
end;

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...