Mittwoch, 22. September 2010

Dateien aus dem Internet herunterladen

Das Herunterladen von Dateien aus dem Internet erfolgt auf die gleiche Weise wie das wie im vorigen Post beschriebene Auslesen des Quelltexts von Webseiten.
Wir benutzten also wieder die Klasse WebClient und von dieser die Methode DownloadFile().
Zwischen dem Herunterladen des Quelltexts und dem Herunterladen von Dateien besteht auch gar kein Unterschied, die Methode DownloadFile() des WebClients lädt in beiden Fällen nämlich die angegebene Ressource herunter, in einem Fall die Datei, auf die explizit verlinkt wurde (z.B. http://www.meinedomain.de/meinedatei.exe), im anderen Fall einfach das komplette HTML - Dokument, also den Quellcode (z.B. http://www.meinedomain.de/).
Um nun aber, wie der Titel schon aussagt, eine bestimmte Datei aus dem Internet zu downloaden, rufen wir die Funktion DownloadFile() mit dem direkten Link zur Datei als 1. Parameter und dem lokalen Pfad am PC, in den die Datei gespeichert werden soll, als 2. Parameter, auf.
Das folgende Beispiel lädt den von mir programmieren Matrix - Bildschirmschoner herunter (System.Net muss eingebunden sein):
WebClient Webclient1 = new WebClient();
Webclient1.DownloadFile("http://205.196.122.15/o09zbpz46rjg/jig1jyyizx0/MatrixSaver.scr", @"C:\Users\User\Downloads\MatrixSaver.scr");

Diese Methode blockiert das Programm nun aber solange, bis die Datei nicht vollständig heruntergeladen wurde. Um den Mainthread weiter laufenzulassen und die Datei asynchron herunterzuladen, kann die Methode DownloadFileAsync() verwendet werden.
Vorher wäre es hilfreich, noch 1 oder 2 Events zu deklarieren, um dem Programm den Status des Downloads mitzuteilen.
Events sind Ereignisse, wie z.B. der Klick auf einen Button, legt man hinter diese eine Methode, wird die Methode aufgerufen, wenn das Ereignis eintritt.
Wir können zum asynchronen File Download 2 Events benutzen, die, wie gesagt, optional sind:
DownloadFileCompleted tritt ein, wenn der Download beendet wurde (kann auch durch einen Fehler auftreten!), DownloadProgressChanged, wenn sich der Fortschritt des Downloads geändert hat.
Methoden zur Behandlung der Ereignisse können über den Operator + hinzugefügt werden, für DownloadFileCompleted beispielsweise so:
DownloadFileCompleted += new AsyncCompletedEventHandler(zielmethode).
zielmethode benötigt nun nur noch die richtige Signatur, d.h. den richtigen Rückgabetyp und die richtigen Parameter, in diesem Fall folgende:
private void zielmethode(object sender, AsyncCompletedEventArgs e).
Das folgende Beispielprogramm startet beim Laden des Formulars das Herunterladen der Internet Explorer 9 Beta (ca. 20 MB) von Microsoft, bei Beendigung des Downloads wird das Ergebnis mit einer MessageBox ausgegeben, der Status des Downloads wird in einer ProgressBar angezeigt, ein entsprechendes Objekt mit dem Namen progressBar1 muss sich auf dem Formular befinden, außerdem muss System.Net mittels using eingebunden sein:

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                WebClient Webclient1 = new WebClient();
                Webclient1.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
                Webclient1.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadStatusChanged);
                Webclient1.DownloadFileAsync(new Uri("http://download.microsoft.com/download/B/4/8/B48BF620-EBF5-4683-8674-A878C5ADB595/IE9-Windows7-x86-deu.exe"), @"C:\Users\User\Downloads\ie9.exe");
            }
            catch (Exception ex)    
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
        {
            // prüfen, ob der Download mit oder ohne Fehler beendet wurde
            if (e.Error == null)
                MessageBox.Show("Download fertig.");
            else
                MessageBox.Show("Download fehlerhaft: " + e.Error);
        }

        private void DownloadStatusChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            // Prozentualen Fortschritt in progressBar1 anzeigen
            progressBar1.Value = e.ProgressPercentage;
        }

Kommentare:

  1. Danke für dieseen Beispiel-Code.
    Das Laden von Dateien funktioniert damit ziemlich schnell.

    AntwortenLöschen
  2. Danke Danke! Funktioniert super :)

    AntwortenLöschen
  3. Sehr schön, danke ...
    Mir fehlte noch

    using System.ComponentModel;

    um den Eventhandler anzusprechen

    AntwortenLöschen