Baixar o arquivo a partir da web para arquivo local com medidor de progresso em C #
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.
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.