Télécharger le fichier du web au fichier local avec indicateur de progression en C #

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

  •  12-09-2019
  •  | 
  •  

Question

J'ai une petite application qui télécharge des fichiers depuis un serveur distant (HTTP) aux utilisateurs le disque dur local, certains fichiers sont grandes, mais je ne sais pas à quel point grand au moment de l'exécution. Y at-il une méthode qui me permet de télécharger un fichier avec un certain type de barre de progression?

Ceci est une application WinForms, en ce moment j'utilise WebClient.DownloadFile () pour télécharger le fichier.

Edit: Je l'ai regardé dans le DownloadProgressChanged et les événements OnDownloadProgressChanged et ils semblent fonctionner très bien, mais ils ne fonctionnent pas pour ma solution. Je télécharge plusieurs fichiers et si j'utilise WebClient.DownloadFileAsync l'événement est appelé plusieurs fois / seconde parce que chaque fichier appelle.
Voici la structure de base de l'application:

  • Télécharger une liste de fichiers généralement environ 114
  • Exécuter une boucle sur la liste des fichiers et télécharger chacun à son desination

Je ne me dérange pas de télécharger chaque fichier séparement mais sans les télécharger avec DownloadFileAsync () Je ne peux pas utiliser les gestionnaires d'événements.

Était-ce utile?

La solution

Utilisez WebClient.OnDownloadProgressChanged . Gardez à l'esprit, il est possible de calculer des progrès si le serveur indique la taille avant.

EDIT:

En regardant votre mise à jour, ce que vous pouvez faire est une file d'attente d'URL. Ensuite, lorsqu'un fichier se termine le téléchargement ( DownloadDataCompleted événement), vous lancer le téléchargement async de l'URL suivante dans la file d'attente. Je n'ai pas testé.

Autres conseils

Manipulez le WebClient DownloadProgressChanged événement .

Je viens d'écrire cela et il semble vraiment faire ce que vous voulez.

En outre, dans l'événement ProgressChanged vous avez la propriété « TotalBytesToReceive » et la propriété « 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;
}

Je avais besoin de résoudre un problème similaire, et l'exemple de code de GenericTypeTea a fait l'affaire; sauf que j'ai découvert que l'événement DownloadDataCompleted ne se déclenche pas lorsque vous appelez la méthode DownloadFileAsync. Au lieu de cela, l'événement DownloadFileCompleted est élevé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top