Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 3162 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá ,

Venho desenvolvendo uma aplicação que utiliza o ACBrDownload para baixar um arquivo por HTTP. Em testes verifiquei que vezes baixa normalmente e vezes retorna o erro: 

Citar

Não foi possível renomear o arquivo: arquivo.ext.part para arquivo.ext.

Logo comecei a pesquisar sobre aqui no fórum e verifiquei que existiam pessoas com o mesmo problema mas nenhuma solução. Então fui para a linha onde o erro acontece no arquivo ACBrDownloadClass e verifiquei que ele tenta renomear o arquivo .part.

Esse é o trecho ORIGINAL do código onde o problema acontece(linhas 336 a 345):

Citar

            if (fResultCode = 200) or (fResultCode = 206) or (fResultCode = 226) then
            begin
              sFileName := Copy(fFilePart, 1, Length(fFilePart) -5);
              if FileExists(sFileName) then
                if not DeleteFile(sFileName) then
                  raise Exception.Create(Format('Não foi possível excluir o arquivo: %s', [sFileName]));

              CopyFile(PChar(fFilePart),PChar(sFileName), False);
              if not RenameFile(fFilePart, sFileName) then
                raise Exception.Create(Format('Não foi possível renomear o arquivo: %s para %s', [fFilePart, sFileName]));
            end;

O sFileName representa o arquivo em seu formato original então se ele já existe ele tenta deletar o arquivo , e se o arquivo não existe ele renomeia o .part para o formato original. Nessa lógica pensei na seguinte problemática: "E se o .part estiver completo mas não foi liberado para uso?" então fiz uma A.T.E(Gambiarra):

Citar

            if (fResultCode = 200) or (fResultCode = 206) or (fResultCode = 226) then
            begin
              sFileName := Copy(fFilePart, 1, Length(fFilePart) -5);
              if FileExists(sFileName) then
                if not DeleteFile(sFileName) then
                  raise Exception.Create(Format('Não foi possível excluir o arquivo: %s', [sFileName]));

              CopyFile(PChar(fFilePart),PChar(sFileName), False);
              //if not RenameFile(fFilePart, sFileName) then
              //  raise Exception.Create(Format('Não foi possível renomear o arquivo: %s para %s', [fFilePart, sFileName]));

            end

Bom e para minha surpresa funcionou! 10/10 vezes de execução do mesmo código.

Logo após verifiquei um problema: o componente passa 2x pelo mesmo trecho te código, então  ele não valida o primeiro if:

Citar

            if FileExists(sFileName) then
                if not DeleteFile(sFileName) then
                  raise Exception.Create(Format('Não foi possível excluir o arquivo: %s', [sFileName]));

porém na segunda passagem pelo trecho ele DELETA o arquivo baixado e por fim retorna erro por não achar o .part

Citar

              if not RenameFile(fFilePart, sFileName) then
                raise Exception.Create(Format('Não foi possível renomear o arquivo: %s para %s', [fFilePart, sFileName]));

Então refatorei o código:

Citar

            if (fResultCode = 200) or (fResultCode = 206) or (fResultCode = 226) then
            begin
              sFileName := Copy(fFilePart, 1, Length(fFilePart) -5);
              if FileExists(sFileName) and FilesExists(fFilePart) then
                if not DeleteFile(sFileName) then
                  raise Exception.Create(Format('Não foi possível excluir o arquivo: %s', [sFileName]));

              if FilesExists(fFilePart) then              
                if not RenameFile(fFilePart, sFileName) then
                  raise Exception.Create(Format('Não foi possível renomear o arquivo: %s para %s', [fFilePart, sFileName]));
            end;

Concluindo o problema era que o código deletava o arquivo baixado e tentava renomear o download(.part) que já tinha sido renomeado anteriormente. Essa foi a solução que encontrei...

 

Até mais !

Daniel Cunha

  • Curtir 1

Captura de tela 2024-07-23 103314.png

Postado

Já no repositório, obrigado.

  • Curtir 1

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

  • Este tópico foi criado há 3162 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.