.NET
VB.NET: Dateioperationen mit Fortschrittsanzeige Teil 3 – Wiederaufnahme von Downloads
Posted on .Wenn man grafische Oberflächen entwickelt wird man irgendwann an dem Punkt kommen wo man Dateien kopieren, verschieben oder herunterladen will. Wenn diese nicht grade wenig und klein sind bietet es sich natürlich an eine Fortschrittanzeige dafür zu erstellen. Damit wird sich diese Serie beschäftigen.
Teil 3 – Wiederaufnahme von Downloads nach einem Abbruch
Wer kennt das nicht, man lädt eine große Datei herunter und plötzlich bricht die Internetverbindung ab. Alles umsonst, und der Download muss neu gestartet werden!
Bild 1: Das Demoprojekt bei der Wiederaufnahme des Downloads
Viele Downloadmanager heutzutage unterstützen das so genannte „wiederaufnehmen“ von Downloads, sodass man nach einem Abbruch nicht die ganze Datei von vorne laden muss.
Doch wie funktioniert das? In diesem Teil werden wir das Projekt aus Beispiel 2 um diese Funktionalität erweitern. Und es ist erschreckend einfach und benötigt nur eine geringe Modifikation!
Zunächst einmal die Theorie. Wenn ihr in den Code aus Teil 2 schaut werdet ihr feststellen, dass beim herunterladen der Datei ein Strom aufgebaut wird, aus dem wir die Daten herunterladen und lokal speichern.
Wenn ihr den Code aus dem Form_Closing() Ereignis löscht, und dann einen laufenden Download durch das Beenden des Programms abbrecht, werdet ihr feststellen, dass die „temporäre“ Datei nochimmer auf der Festplatte liegt!
Diese Datei ist natürlich nutzlos, da wir nur eine Teilmenge davon geladen haben. Aber da wir herausfinden können, wieviele Bytes wir schon geladen haben wissen wir schon wo wir wieder ansetzen müssen!
Dementsprechend müssen wir den neuen Download nicht an Stelle 0 im Strom starten, sondern an stelle [Anzahl heruntergeladener bytes].
Ich möchte jetzt nicht den ganzen Code hier posten sondern nur die Schlüsselstelle hier:
Dim request As HttpWebRequest = HttpWebRequest.Create(url) request.Proxy = Nothing request.AddRange(CInt(curBytes)) Dim response As HttpWebResponse = request.GetResponse If Not response.StatusCode = HttpStatusCode.PartialContent Then 'falls der Server wiederaufnahme nicht unterstützt bei 0 anfangen curBytes = 0 End IfMan muss beim erstellen des Requests und noch vor dem Response dem Server mitteilen, ab wo er die Daten schicken soll, da wir ja nicht die ganze Datei brauchen!
Dies machen wir mit dem Befehl request.AddRange(CInt(curBytes)) der dafür sorgt, dass der Stream an der von uns gewünschten Stelle startet!
Leider unterstützen nicht alle Server die Wiederaufnahme von Downloads. So kann es vorkommen, dass der Download nicht fortgesetzt werden kann. Diesen besonderen Fall muss man natürlich behandeln.
Wenn wir die Antwort vom Server bekommen (Response) können wir prüfen, welche Statusmeldung der Server zurückgegeben hat. Dafür benutzen wir die Methode response.StatusCode.
Wenn alles gut gelaufen ist und der Server die Wiederaufnahme zulässt bekommen wir den Status Code 206 – PartialContent. Wenn der Server es nicht unterstützt kriegen wir den Code 200 – OK.
Eine komplette Liste mit den Server Responses findet ihr im MSDN!
Wenn wir den Code 200 bekommen müssen wir die Datei wieder von Null laden und müssen darauf mit der Rücksetzung im Code reagieren!
Ich setze in der Demo noch den Proxy auf Null. Das mache ich, da ich ein paar Probleme hatte und der Stream etwas falsch ankam. Ihr könnt es gerne mal ohne diesen Befehl testen und dann hier berichten.
Um das ganze zu testen könnt ihr euch die Demo laden. Startet dann einfach einen Download und unterbrecht diesen irgendwo in der Mitte. Dann startet das Programm neu und startet den selben Download nochmal.
Ihr werdet nun gefragt, ob ihr diese Datei überschreiben wollt (Standartfrage von Windows) und ob ihr dann den Download fortsetzen wollt. Beides mit „Ja“ beantworten.
Nun müsste das Programm den Download wiederaufnehmen.
Das Demoprojekt gibt es hier: Download
Teil 1 – Kopieren und Verschieben von Dateien
Teil 2 – Download von Dateien
Teil 3 – Wiederaufnahme von Downloads nach einem Abbruch
Teil 4 – Upload von Dateien
Sebastian Gross
http://www.bigbasti.comSebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.
Author Toby
Posted at 17:55 6. September 2011.
Hey,
vielen Dank für die Anleitung 😀