Descargar el archivo desde la web al archivo local con la barra de progreso en C #

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

  •  12-09-2019
  •  | 
  •  

Pregunta

Tengo una pequeña aplicación que descarga algunos archivos desde un servidor remoto (HTTP) para los usuarios de disco duro local, algunos de los archivos son grandes, pero no sé qué tan grande en tiempo de ejecución. ¿Hay algún método que permita que me descarga un archivo con algún tipo de indicador de progreso?

Esta es una aplicación de Windows Forms, en este momento estoy usando WebClient.DownloadFile () para descargar el archivo.

Editar: He mirado en el DownloadProgressChanged y OnDownloadProgressChanged eventos y parece funcionar bien, pero no van a trabajar para mi solución. Estoy descargando varios archivos y si uso WebClient.DownloadFileAsync entonces el evento se llama varias veces / segundo, porque cada archivo de la llama.
Esta es la estructura básica de la aplicación:

  • Descargar una lista de archivos típicamente alrededor de 114
  • Ejecutar un bucle sobre la lista de archivos y descarga de cada uno a su desination

No me importa la descarga de cada archivo, pero éste por separado sin tener que descargarlos con DownloadFileAsync () No puedo utilizar los controladores de eventos.

¿Fue útil?

Solución

WebClient.OnDownloadProgressChanged . Tenga en cuenta, sólo es posible calcular el progreso si el servidor informa el tamaño en la delantera.

EDIT:

En cuanto a su actualización, lo que puede intentar es hacer una cola de la URL. Entonces, cuando un archivo termine de descargarse ( DownloadDataCompleted evento), se pondrá en marcha la descarga asíncrona de la siguiente URL en la cola. No he probado esto.

Otros consejos

acabo de escribir esto y que sin duda parece hacer lo que quiera.

Además, dentro de la ProgressChanged evento que tenga la propiedad "TotalBytesToReceive" y la propiedad "BytesReceived".

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;
}

que tenía que resolver un problema similar, y el ejemplo de código de GenericTypeTea hizo el truco; excepto que descubrí que el evento DownloadDataCompleted no se desencadena cuando se llama al método DownloadFileAsync. En lugar de ello, se provoca el evento DownloadFileCompleted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top