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

Shfileoperation


Paulo Nobre

Pergunta

Tenho um programa(que usa banco de dados) que na pasta do executável contém uma pasta chamada Dados.

Criei uma rotina para fazer backup desta pasta, ou seja, seriam copiados os arquivos e subpastas de dados para uma outra pasta chamada Backup.

No oncreate do form o programa verifica se existe o diretório Backup, caso contrário cria esta pasta.

Tipo If not DirectoryFileExist(Diretorio do programa\Backup) then Makedir......

Para copiar estou usando

var

Dados: TSHFileOpStruct;

begin

table1.close//fecho a tabela aqui para poder copiar

FillChar(Dados,SizeOf(Dados), 0);

with Dados do

begin

wFunc := FO_COPY;

pFrom := PChar('Diretório do programa\Dados\*.*');

pTo := PChar('Diretório do programa\Backup\');

fFlags:= FOF_ALLOWUNDO;

end;

SHFileOperation(Dados);

table1.open//Abro aqui para voltar a mostrar

end;

Acontece que as vezes aparece a mensagem de erro

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

Porém as vezes consigo copiar.

Alguém saberia dizer o que pode estar havendo?

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Olá.

Já me deparei com este problema... e como não consegui resolver (por exemplo, descobri que às vezes o programa achava que a tabela ainda estava em uso - sendo este talvez um dos motivos da falha), eu passei a usar o CopyFile(PChar('c:\dados\tabela1.db'),PChar('c:\backup\tabela1.db'),false) e depois verificar as datas e tamanhos para saber se realmente copiou...

Aí funcionou....

Quanto ao arquivo poder estar sendo considerado como "ainda aberto", descobri isso quando, depois de uma falha na tentativa de cópia, abri o DbExplorer e tentei criar um campo temporario (alter table 'tabela1.db' add temp integer) e recebi a mensagem "table busy"... sendo que a tabela não estava aberta (openfiles no XP e netwatch no win98 para checar)...

Espero ter ajudado!

P.Bergo

Link para o comentário
Compartilhar em outros sites

  • 0

O parâmetro pFrom de SHFileOperation é um array de strings, então deve ser inserido um #0 adicional dizendo que não há mais strings; pTo também segue o mesmo. Então dependendo do momento da chamada de SHFileOperation, se o próximo byte ao final da string de pFrom for um #0 ele funciona, senão não funciona.

Tente:

pFrom := PChar('Diretório do programa\Dados\*.*' + #0);
pTo := PChar('Diretório do programa\Backup\' + #0);

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado a vocês, PauloBergo e s3c.

Então pelo que entendi, embora achasse também que poderia ser pela tabela, o problema está no array.

Para aproveitar o meu código vou tentar o que s3c sugeriu.

Obrigado por mais esta.

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