2009-07-10 3 views
3

Ich habe eine kleine App, die einige Dateien von einem Remote-Server (HTTP) auf die lokale Festplatte des Benutzers herunterlädt, einige der Dateien sind groß, aber ich nicht wissen, wie groß zur Laufzeit ist. Gibt es eine Methode, mit der ich eine Datei mit einer Art Fortschrittsanzeige herunterladen kann?Laden Sie Datei von Web zu lokaler Datei mit Fortschrittsanzeige in C#

Dies ist eine WinForms App, im Moment benutze ich WebClient.DownloadFile(), um die Datei herunterzuladen.

Bearbeiten: Ich habe in die DownloadProgressChanged und OnDownloadProgressChanged Ereignisse untersucht und sie scheinen gut zu funktionieren, aber sie werden nicht für meine Lösung funktionieren. Ich lade mehrere Dateien herunter und wenn ich WebClient.DownloadFileAsync verwende, wird das Ereignis mehrmals/Sekunde aufgerufen, weil jede Datei es aufruft.
Hier ist die grundlegende Struktur der App: typischerweise etwa 114

  • Führen Sie eine Schleife über der Liste der Dateien

    • eine Liste von Dateien herunterladen und jedes seiner desination

    ich herunterladen Es macht nichts, wenn ich jede Datei einzeln herunterlade, ohne sie mit DownloadFileAsync() herunterzuladen. Ich kann die Event-Handler nicht benutzen.

  • Antwort

    5

    Verwenden Sie WebClient.OnDownloadProgressChanged. Beachten Sie, dass der Fortschritt nur berechnet werden kann, wenn der Server die Größe im Voraus angibt.

    EDIT:

    bei Ihrem Update Sehen, was Sie versuchen können, ist eine queue von URLs zu machen. Wenn eine Datei heruntergeladen wurde (DownloadDataCompleted Ereignis), wird der asynchrone Download der nächsten URL in der Warteschlange gestartet. Ich habe das nicht getestet.

    +0

    OnDownloadProgressChanged ist eine Methode und wird dem OP nicht helfen. Alles was es tut, ist, das DownloadProgressChanged-Ereignis wie in meiner Antwort anzuwerfen. Das Abfangen des Ereignisses ist erforderlich. – stevehipwell

    +2

    Ich denke, du bist pingelig, Stevo. Ja, es ist erforderlich, die Veranstaltung zu verfolgen, und ich habe nie etwas anderes gesagt. –

    +0

    Sie würden nie OnDownloadProgressChanged verwenden, alle Op muss ein Ereignis abfangen. OnDownloadProgressChanged verwirrt nur die Angelegenheit. – stevehipwell

    1

    Ich habe gerade dies geschrieben und es scheint definitiv zu tun, was Sie wollen.

    Außerdem haben Sie innerhalb des ProgressChanged-Ereignisses die Eigenschaft "TotalBytesToReceive" und die Eigenschaft "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; 
    } 
    
    1

    Ich musste ein ähnliches Problem lösen, und das Codebeispiel von GenericTypeTea hat es geschafft; außer dass ich entdeckte, dass das DownloadDataCompleted-Ereignis nicht ausgelöst wird, wenn Sie die DownloadFileAsync-Methode aufrufen. Stattdessen wird das DownloadFileCompleted-Ereignis ausgelöst.

    Verwandte Themen