Downloader richtig programmieren

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Downloader richtig programmieren

    Abend!
    Da mir gerade etwas langweilig ist, wollte ich mal einen kleinen Downloader erstellen, aber ich habe keine Idee, wie ich das am besten umsetzen soll.
    Also als kleines Beispiel: Man gibt einen Downloadlink in eine TextBox ein und startet den Download per Buttonklick. Der Name, Fortschritt, etc. soll in einer ListView angezeigt werden. Nun stelle ich mir halt die Frage, wie ich für jeden Download die ganzen Daten (Dateiname, von welcher Seite es ist, Fortschritt [wie viel bereits runtergeladen + wie viel die Gesamtgröße beträgt]) speichern und später anzeigen soll. Also eine einfache List(Of String) wäre dazu nicht geeignet, weil ich da ja nur einen Wert übergeben könnte oder? Hier noch ein kleiner Code, wie ich anfangen wollte:

    VB.NET-Quellcode

    1. Public Class DownloadItem
    2. Public FileName As String
    3. Public HostName As String
    4. Public CurrentBytes As Double
    5. Public TotalBytes As Double
    6. End Class
    7. Public Class Main
    8. Sub Button_Click (...) Handles Button.Click
    9. NewDownload("http://www.blubb.de/test.exe")
    10. End Sub
    11. Sub NewDownload(ByVal URL As String)
    12. Dim item As New DownloadItem
    13. Dim uri As New URI(URL)
    14. item.HostName = uri.Host
    15. item.FileName = uri.Segments(uri.Segments.Length - 1)
    16. 'item soll nun z.B. in eine Liste eingetragen werden, die dann alle Variablen der Klasse "DownloadItem" enthält um sie später in z.B. einer ListView anzeigen zu können..
    17. End Sub
    18. End Class

    Wäre sowas in der Art eine gute Möglichkeit oder gibt es da was viel besseres?
    Und ich will hier jetzt auch keinen C&P-Code haben, sondern einfach nur wissen, wie man das am besten umsetzen könnte.
    Auch z.B. wenn man einen Download stoppt, wie sollte ich das am besten realisieren? Geht sowas mit Enum oder Structur oder irgendwas anderem, damit man dann z.B. abfragen kann:

    VB.NET-Quellcode

    1. 'sind jetzt nur so kleine Beispiele..
    2. If itemList(0).Running Then...
    3. 'oder
    4. If itemList(0).Finished Then
    5. ListView.Remove(itemList(0))
    6. End If


    Falls jemand verstanden hat, was nun mein eigentliches Problem ist, dann wäre ich sehr dankbar, wenn dieser auch eine Antwort für mich hat :)
    Zunächstmal würde ich als Datenhaltung ein typisiertes Dataset empfehlen, und dort eine DataTable reinmachen, mit den Properties, die du in deinem DownloadItem aufführst.
    Und dann anstelle einer List(Of DownloadItem) die DataTable verwenden.
    so eine DataTable kann fabelhaft an ein Datagridview gebunden werden, und im Grunde ist deine App dann fertig.

    Etwas problematisch ist die Darstellung einer Progressbar in einer DGV-Zelle. Hier müsstest du im CellPainting-Event ein rechteck drawen, welches den Fortschritt repräsentiert - eine ProgressbarDataGridViewColumn gibt es leider noch nicht (wär mal ne Idee, das zu machen - obwohl auf CodeProject gibts sowas bestimmt)

    Wie willst du die Downloaderei denn überhaupt machen?

    Weil wenn du immer nur einen Download durchführst, würde doch auch eine PGB reichen, oder?
    Vielen Dank für deine Antwort!
    Werde gleich mal mit dem DataSet-/Table rumexperimentieren, hab damit noch nicht gearbeitet...
    Etwas problematisch ist die Darstellung einer Progressbar in einer DGV-Zelle.

    Ich hab auf CodeProject.com bereits ein Beispiel gefunden, wie man eine ProgressBar in eine ListView einfügt, mal schauen ob sich das auch mit einer DataGridView machen lässt.
    Weil wenn du immer nur einen Download durchführst, würde doch auch eine PGB reichen, oder?

    Naja, eigentlich wollte ich halt per Buttonklick die Downloadlinks einfügen, und nach jedem fertigen Download wird dann der nächste Eintrag ausgewählt. Und am besten wäre es natürlich, wenn man selbst aussuchen könnte, wie viele Downloads gleichzeitig durchgeführt werden, dazu müsste ich ja einfach einen neuen WebClienten deklarieren, BTW: wäre dafür überhaupt ein WebClient passend oder sollte ich lieber etwas anderes (z.B. HttpWebRequest) benutzen?