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

(Resolvido) COPIA DE ARQUIVOS COM COMANDO PChar


anabon

Pergunta

Olá boa tarde galera ....

 

   Estou trabalhando em um pequeno projeto de sincronização no delphi rad 10.2, para copiar os arquivos estou utilizando o comando PChar, porém tenho três extensões diferente que desejo copiar, mas meu código copia apenas um... não sei mais o que fazer para sanar esta questão. Se alguém puder ajudar, desde já agradeço. Segue abaixo o código que estou utilizando para fazer as copias...

 

  FillChar(Dados,SizeOf(Dados), 0);
  with Dados do
  begin
    wFunc := FO_COPY;
    pFrom := PChar('C:\PASTA_ORIGEM\*.CON');
    pFrom := PChar('C:\PASTA_ORIGEM\*.SAC');
    pFrom := PChar('C:\PASTA_ORIGEM\*.VIX');
    pTo   := PChar(Edit1.Text);
    fFlags:= FOF_ALLOWUNDO;
    mmoAlterados.Text;
  END;
  end;
  SHFileOperation(Dados);
  mmoAlterados.Clear;

 

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Acredito que o problema esteja ocorrendo pois na verdade você está sobrescrevendo a propriedade pFrom e não adicionando novos valores, o que você pode fazer é criar uma função que recebe por parâmetro a origem e o destino e a função copia os arquivos.

 

ex:

function TForm1.CopiarArquivos(Origem, Destino: String): Boolean;
var
  Dados: _SHFILEOPSTRUCT;
begin
  with Dados do
  begin
    Wnd := Application.Handle;
    wFunc := FO_COPY;
    pFrom := PChar(Origem);
    pTo := PChar(Destino);
    fFlags := FOF_RENAMEONCOLLISION;
  end;  
  SHFileOperation(Dados);
  Result := Dados.fAnyOperationsAborted;
end;

Exemplo de uso:

procedure TForm1.Button4Click(Sender: TObject);
begin
  CopiarArquivos('C:\Mensagens\*.pdf', 'C:\Mensagens\teste');
  CopiarArquivos('C:\Mensagens\*.sql', 'C:\Mensagens\teste');
  CopiarArquivos('C:\Mensagens\*.doc', 'C:\Mensagens\teste');
end;

--

Outra opção é usar o comando CopyFile, ex:

CopyFile(PChar(Application.ExeName), PChar(FileName), False);

Os parâmetros são:

 1º - Caminho do arquivo já existente
 2º - Caminho do novo arquivo
 3º - Mensagem de falha caso já exista o novo arquivo

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

  • 0

Muito obrigada  Leo_Cj, deu certo......

  Agora tenho outras duas duvidas....

 

1) alguns dos arquivos que estou copiando tem attrib, coloquei uma linha chamando um arquivo .bat que tira o attrib para copia (attrib -a *.*), mas de nada adiantou, tem alguma forma de verificar e tirar estes atrrib antes da copia?

2) Quando a copia começa o windows avisa que preciso de permissão para copiar os arquivos e também que estes arquivos já existem, existe uma maneira em que eu possa transformar isso para mais automático sem a interação do usuário?

 

  Desde já agradeço imensamente

Link para o comentário
Compartilhar em outros sites

  • 0

Por nada,

para verificar os atributos de um arquivo pelo Delphi, você pode usar esse exemplo:

procedure TForm1.Button5Click(Sender: TObject);
var
  Attributes: Cardinal;
begin
  ListBox1.Clear;
  Attributes := GetFileAttributes(FileName);
  if (Attributes and faArchive > 0) then
    ListBox1.Items.Add('Archived file');
  if (Attributes and faReadOnly > 0) then
    ListBox1.Items.Add('ReadOnly file');
  if (Attributes and faSysFile > 0) then
    ListBox1.Items.Add('System file');
  if (Attributes and faHidden > 0) then
    ListBox1.Items.Add('Hiden file');
  if (Attributes and faSymLink > 0) then
    ListBox1.Items.Add('Symbolic Link file');
  if (Attributes and faNormal > 0) then
    ListBox1.Items.Add('Normal File');
end;

Para alterar os atributos de um arquivo você pode utilizar a função SetFileAttributes

Ex:

if (SetFileAttributes(FileName, faArchive or faSysFile)) then // Aqui deixamos o arquivo com os atributos de arquivado e arquivo do sistema
  begin
    ListBox1.Items.Add('Atributos alterados');  
  end;

if (SetFileAttributes(FileName, faNormal)) then // Aqui removemos todos os atributos.
  begin
    ListBox1.Items.Add('Atributos alterados');  
  end;

Quanto à permissão, tenta rodar o programa como administrador.

E quanto ao aviso de arquivo existente, qual a flag que você setou em fFlags?

experimente utilizar a FOF_RENAMEONCOLLISION, a mesma renomeia o novo arquivo automaticamente caso já exista um arquivo de mesmo nome na pasta

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigada, mais uma vez ....

  deu certinho ... menos para um determinado arquivo .... no inicio do código verifico se o arquivo principal esta sendo utilizado para isso uso

if  NOT FileOpen('C:\viennas\PARS.SAC',fmOpenReadWrite) = 0 then

porém mesmo com ele fechado quando a copia se inicializa a mensagem que recebo do windows é que ele esta aberto pelo meu exe (do delphi). Já tentei diversas formar de fechar o mesmo, e até da um free e refresh no form, mas de nada me adianto segue em anexo a menssagem recebida pelo windows...

 

Mas uma vez desde já agradeço!!!!

 

errocopia.jpg

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...