Baixar o arquivo a partir da web para arquivo local com medidor de progresso em C #

StackOverflow https://stackoverflow.com/questions/1108292

  •  12-09-2019
  •  | 
  •  

Pergunta

Eu tenho um pequeno aplicativo que faz o download alguns arquivos de um servidor remoto (HTTP) para os usuários disco rígido local, alguns dos arquivos são grandes, mas eu não sei o quão grande em tempo de execução. Existe algum método que permita-me fazer download de um arquivo com algum tipo de medidor de progresso?

Este é um aplicativo WinForms, agora eu estou usando WebClient.DownloadFile () para baixar o arquivo.

Edit: Eu olhei para o DownloadProgressChanged e OnDownloadProgressChanged eventos e eles parecem funcionar bem, mas eles não vão trabalhar para a minha solução. Estou baixando vários arquivos e se eu usar WebClient.DownloadFileAsync em seguida, o evento é chamado várias vezes / segundo, porque cada arquivo chama.
Aqui é a estrutura básica do aplicativo:

  • Baixar uma lista de arquivos normalmente cerca de 114
  • Executar um loop sobre a lista de arquivos e download de cada um para a sua desination

Eu não me importo de baixar cada arquivo seperatly mas sem baixá-los com DownloadFileAsync () Eu não posso usar os manipuladores de eventos.

Foi útil?

Solução

Use WebClient.OnDownloadProgressChanged . Tenha em mente, só é possível para o progresso calcular se o servidor informa o tamanho na frente.

EDIT:

Olhando para a sua atualização, o que você pode tentar está fazendo um fila de URLs. Então, quando um arquivo termina de baixar ( DownloadDataCompleted eventos), você vai lançar o download assíncrono do próximo URL na fila. Eu não testei isso.

Outras dicas

Lidar com o WebClient DownloadProgressChanged evento .

Acabo de escrever isso e definitivamente parece fazer o que quiser.

Além disso, dentro do evento ProgressChanged você tem a propriedade "TotalBytesToReceive" eo "BytesReceived" propriedade.

private void StartDownload()
{

    // Create a new WebClient instance.
    WebClient myWebClient = new WebClient();

    // Set the progress bar max to 100 for 100%
    progressBar1.Value = 0;
    progressBar1.Maximum = 100;

    // Assign the events to capture the progress percentage
    myWebClient.DownloadDataCompleted+=new DownloadDataCompletedEventHandler(myWebClient_DownloadDataCompleted);
    myWebClient.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(myWebClient_DownloadProgressChanged);

    // Set the Uri to the file you wish to download and fire it off Async
    Uri uri = new Uri("http://external.ivirtualdocket.com/update.cab");
    myWebClient.DownloadFileAsync(uri, "C:\\Update.cab");

}

void myWebClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

void myWebClient_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    progressBar1.Value = progressBar1.Maximum;
}

Eu precisava resolver um problema semelhante, e exemplo de código de GenericTypeTea fez o truque; Só que eu descobri que o evento DownloadDataCompleted não é acionado quando você chamar o método DownloadFileAsync. Em vez disso, o evento DownloadFileCompleted é levantada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top