BigBastis Blog

VB.NET: Dateioperationen mit Fortschrittsanzeige Teil 3 – Wiederaufnahme von Downloads

Introduction

user

Sebastian Gross

Sebastian 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.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.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!

webloadgoon1Bild 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 If

Man 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

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian 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.

Comments
user

Author Toby

Posted at 17:55 6. September 2011.

Hey,
vielen Dank für die Anleitung 😀

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (1) ...
Navigation