Scaricare il file dal web al file locale con indicatore di avanzamento in C #

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

  •  12-09-2019
  •  | 
  •  

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top