Herunterladen die Datei aus dem Internet zur lokalen Datei mit Fortschrittsanzeige in C #

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

  •  12-09-2019
  •  | 
  •  

Frage

Ich habe eine kleine Anwendung, die einige Dateien von einem Remote-Download (HTTP) Server an die Benutzer der lokalen Festplatte, einige der Dateien groß sind, aber ich weiß nicht, wie zur Laufzeit groß. Gibt es eine Methode, die ich eine Datei herunterzuladen mit irgendeiner Art von Fortschrittsanzeige kann?

Dies ist eine WinForms-Anwendung, jetzt bin ich mit WebClient.DownloadFile (), um die Datei herunterzuladen.

Edit: Ich habe in den Downloadprogress sah und OnDownloadProgressChanged Ereignisse und sie scheinen gut zu funktionieren, aber sie werden für meine Lösung nicht funktionieren. Ich bin das Herunterladen mehrerer Dateien und wenn ich WebClient.DownloadFileAsync verwenden dann wird das Ereignis mehrmals / Sekunde, da jede Datei nennt es genannt.
Hier ist die grundlegende Struktur der App:

  • Laden Sie eine Liste von Dateien in der Regel etwa 114
  • Führen Sie eine Schleife über die Liste der Dateien und downloaden jedes seine desination

Ich habe nichts dagegen jede Datei separat herunterzuladen, aber ohne sie mit DownloadFileAsync Herunterladen () Ich nicht die Ereignishandler verwenden können.

War es hilfreich?

Lösung

Verwenden Sie WebClient.OnDownloadProgressChanged . Denken Sie daran, es ist nur möglich, Fortschritte zu berechnen, wenn der Server die Größe vorne berichtet.

EDIT:

an Ihrem Update Sehen, was Sie versuchen können, machen eine Warteschlange von URLs. Wenn dann eine Datei herunterzuladen beendet ( DownloadDataCompleted Veranstaltung), werden Sie von dem Asynchron-Download der nächsten URL in der Warteschlange starten. Ich habe nicht getestet.

Andere Tipps

Gehen Sie mit dem WebClient Downloadprogress Veranstaltung .

Ich habe das gerade geschrieben und es scheint auf jeden Fall zu tun, was Sie wollen.

Auch in der Progress Veranstaltung haben Sie die „TotalBytesToReceive“ Eigenschaft und die „BytesReceived“ Eigenschaft bekommen.

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

Ich brauchte ein ähnliches Problem zu lösen, und GenericTypeTea des Codebeispiel hat den Trick; außer dass ich entdeckte, dass das DownloadDataCompleted Ereignis nicht ausgelöst, wenn Sie die DownloadFileAsync Methode aufrufen. Stattdessen wird das DownloadFileCompleted Ereignis ausgelöst hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top