Ir para conteúdo
  • Cadastre-se

dev botao

[Alteração de Código] Sugestão para melhoria de código ACBrFTPDownload


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 2593 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa Tarde!

Me deparei com a seguinte situação, preciso baixar alguns arquivos de um host FTP, porém quando a primeira opção estiver offline gostaria que ele tentasse baixar do segundo host, então escrevi a seguinte função.

function RecebeArquivoFTP(const aArquivoFTP,
  aArquivoLocal: String; aHookMonitor: TAcbrDownloadHookMonitor = nil): Boolean;
var
  ArquivoLocal: String;
  CaminhoDestino: String;
  ArquivoDestino: String;
  FACBrDownload: TACBrDownload;
  i: Integer;
begin
  Result := False;
  FACBrDownload := TACBrDownload.Create(nil);
  try
    for i := 0 to Length(FTP_HOST) do
    begin
      try
        FACBrDownload.Protocolo       := protFTP;
        FACBrDownload.FTP.FtpHost     := FTP_HOST[i];                //constante, array de strings com as informações do hosts.
        FACBrDownload.FTP.FtpPort     := FTP_PORT[i];
        FACBrDownload.FTP.FtpUser     := FTP_USER[i];
        FACBrDownload.FTP.FtpPass     := FTP_PASSWORD[i];
        FACBrDownload.OnHookMonitor   := aHookMonitor;
        ArquivoLocal   := PadraoBarrasWindows(aArquivoLocal);		//função para adequar o padrao das barras.
        CaminhoDestino := TPath.GetDirectoryName(ArquivoLocal);
        ArquivoDestino := TPath.GetFileName(ArquivoLocal);
        if not(DirectoryExists(ExtractFilePath(ArquivoLocal))) then
          ForceDirectories(ExtractFilePath(ArquivoLocal));
        if (FileExists(ArquivoLocal +'.part')) then
          DeleteFile(ArquivoLocal +'.part');
        if (FileExists(ArquivoLocal)) then
          DeleteFile(ArquivoLocal);

        FACBrDownload.DownloadDest    := CaminhoDestino;
        FACBrDownload.DownloadNomeArq := aArquivoFTP;
        FACBrDownload.DownloadUrl     := IncluirSeparadorDiretorio(FACBrDownload.FTP.FtpHost, '/') + aArquivoFTP;

        FACBrDownload.StartDownload;

        Result := (FACBrDownload.DownloadStatus = stDownload);
        if (Result) then
          Break;
      except
        // Não levanta a exceção, apenas tenta na próxima iteração
      end;
    end;
  finally
    FACBrDownload.Free;
  end;
end;

Porém, se por algum motivo ocorre alguma exceção na tentativa de login dentro do ACBr ele simplesmente da um exit como mostra o código abaixo.

  // FTP Login
  if not fFTPSend.Login then
    Exit;

Minha sugestão seria ele criar uma exceção caso ocorresse algum problema no login:

  // FTP Login
  if not fFTPSend.Login then
    raise Exception.Create('Não foi possível efetuar o login!');

Peço desculpas por qualquer inconveniente ou confusão no código pois estou iniciando na programação... Segue em anexo o arquivo com a alteração.

 

ACBrFTPDownload.pas

Postado

@Juliomar Marchetti O que eu sugeri foi ao invés de usar Exit caso a tentativa de login com o FTP não ocorra, que o componente use Exception.Create. De um dif com o arquivo que postei e o do repositório. 

É apenas para ele retornar uma exceção caso ocorra algum problema no login, como por exemplo o host estiver fora do ar.

Da forma que está hoje com o Exit ele simplesmente sai do método e não retorna nada...

O código RecebeArquivoFTP que postei foi para que se alguém quisesse reproduzir o problema.

Mas mesmo assim muito obrigado pela resposta!

  • Fundadores
  • Solution
Postado

Não sou o autor ou usuário do ACBrDownload... mas a vantagem do componente, é facilitar a criação de eventos de monitoramento do Download...

A sugestão é válida...parece um erro, como estava... dar um Exit no caso de falha não daria pra saber se houve sucesso ou não... apliquei a modificação no SVN...

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Moderadores
Postado
14 horas atrás, AugustoKnitsch disse:

@Juliomar Marchetti O que eu sugeri foi ao invés de usar Exit caso a tentativa de login com o FTP não ocorra, que o componente use Exception.Create. De um dif com o arquivo que postei e o do repositório. 

É apenas para ele retornar uma exceção caso ocorra algum problema no login, como por exemplo o host estiver fora do ar.

Da forma que está hoje com o Exit ele simplesmente sai do método e não retorna nada...

O código RecebeArquivoFTP que postei foi para que se alguém quisesse reproduzir o problema.

Mas mesmo assim muito obrigado pela resposta!

Augusto veja que o Daniel aplicou as mudanças e eu também entendi depois que li esse texto

Obrigado.

12 horas atrás, Daniel Simoes disse:

Não sou o autor ou usuário do ACBrDownload... mas a vantagem do componente, é facilitar a criação de eventos de monitoramento do Download...

A sugestão é válida...parece um erro, como estava... dar um Exit no caso de falha não daria pra saber se houve sucesso ou não... apliquei a modificação no SVN...

 

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Este tópico foi criado há 2593 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.