Scaricare il file dal web al file locale con indicatore di avanzamento in C #
Domanda
Ho una piccola applicazione che scarica alcuni file da un server remoto (HTTP) per gli utenti locali hard disk, alcuni dei file sono grandi, ma non so quanto grande in fase di esecuzione. Esiste un metodo che mi permetterà scaricare un file con un certo tipo di indicatore di avanzamento?
Questa è un'applicazione WinForms, in questo momento sto usando WebClient.DownloadFile () per scaricare il file.
Modifica:
Ho guardato nel DownloadProgressChanged e gli eventi OnDownloadProgressChanged e sembrano funzionare bene, ma non funziona per la mia soluzione. Sto scaricando diversi file e se uso WebClient.DownloadFileAsync allora l'evento è chiamato diverse volte / secondo perché ogni file lo chiama.
Ecco la struttura di base delle app:
- Scarica un elenco di file in genere circa 114
- Eseguire un ciclo su l'elenco dei file e scaricare ognuno al suo desination
Non mi importa il download di ogni file in modo esclusivo, ma senza scaricarli con DownloadFileAsync () non posso usare i gestori di eventi.
Soluzione
WebClient.OnDownloadProgressChanged . Tenete a mente, è possibile solo per calcolare i progressi se il server segnala la dimensione in attacco.
EDIT:
Guardando il tuo aggiornamento, quello che si può provare è fare una coda di URL. Poi, quando un file termina il download ( DownloadDataCompleted evento), si avvierà il download asincrono del prossimo URL nella coda. Non ho ancora testato questo.
Altri suggerimenti
Maneggiare il WebClient DownloadProgressChanged evento .
Ho appena scritto questo e sembra sicuramente a fare quello che vuoi.
Inoltre, all'interno del ProgressChanged evento che hai la proprietà "TotalBytesToReceive" e la proprietà "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;
}
ho bisogno di risolvere un problema simile, e l'esempio di codice di GenericTypeTea ha fatto il trucco; tranne che ho scoperto che l'evento DownloadDataCompleted non viene generato quando si chiama il metodo DownloadFileAsync. Al contrario, l'evento DownloadFileCompleted viene sollevato.