Mehrere Dateien per DownloadFileAsync anhand einer filelist

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von djmatrix1987.

    Mehrere Dateien per DownloadFileAsync anhand einer filelist

    Hallo liebe Community,

    ich steh vor nem loch.. Find die Brücke nicht ?(

    Ich bastel grade an einem Downloader, der an die 5000 Dateien (Überwiegend Textdateien und DLLs) nacheinander Downloaden soll.

    Die Dateien stehen alle in einer Textdatei. in jeder Zeile eine Datei. Diese habe ich bereits per io.file.readalllines in filelist() eingelesen

    Danach habe ich mir die Anzahl der einträge in filelist() in einen integer namens files_filelist gespeichtert, um hinterher einen Statusbalken für den kompletten Fortschritt in % des downloads ausgeben zu lassen. (int(gedownloadet file / alle files * 100))

    Das funzelt bisher super :D

    Nun stehe ich vor dem problem, das ich die Dateien einzelnd nacheinander runterladen muss. Und das mit DownloadFileAsync, da ich für jede Datei auch einen Fortschritsbalken haben will.

    Nun weiß ich, das ich Handler hinzufügen muss. Aber wie ich das mit der schleife machen muss, da hab ich keine ahnung mehr. Eine Datei mit download fortschrit ist kein Problem. Aber wenns dann an mehreren geht. Naja.. :D

    Mein derzeitiger Code (Download beginnt auf CLICK)

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Dim _WebClient As New System.Net.WebClient()
    3. AddHandler _WebClient.DownloadFileCompleted, AddressOf _DownloadFileCompleted
    4. AddHandler _WebClient.DownloadProgressChanged, AddressOf _DownloadProgressChanged
    5. _WebClient.DownloadFileAsync(New Uri("http://fileurl/files/"), dloc & "files\")
    6. End Sub
    7. Private Sub _DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
    8. End Sub
    9. Private Sub _DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    10. End Sub


    Hoffe ihr könnt mir da helfen, steh ich aufm schlauch. :(

    Mfg
    Ben
    Pack das ganze Download-Zeug in eine separate Klasse. Das macht den geringsten Aufwand.
    Organisiere den Aufruf so, dass erst nach dem DownloadFileCompleted-Event in Deine Schleife zurückgesprungen wird und der nächste File gestartet wird.
    Leite das DownloadProgressChanged-Event per BackgroundWorker1.ReportProgress() an die aufrufende Klasse durch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    djmatrix1987 schrieb:

    Ich bastel grade an einem Downloader, der an die 5000 Dateien (Überwiegend Textdateien und DLLs) nacheinander Downloaden soll.

    Wäre es nicht besser, du würdest mehrere Downloads gleichzeitig ausführen? Vlt. maximal 100 immer parallel?
    Ist natürlich komplizierter, und mitte Progressbar mussman überlegen, ob da wirklich für jede der 5000 Dateien der Fortschritt einzeln angezeigt wern muß.

    In Multi-Tutorial, der MatchSearcher vollführt einen parallelen Download mehrerer urls. Allerdings nicht mit WebClient, sondern WebRequest ist für sowas besser geeignet.
    Insbes. 100 Downloads gehen evtl. nur mit den asynchronen Methoden, die der WebClient nicht hat. Beim WebClient müssteman gucken, ob er pro asynchronen Download einen Thread belegt, oder ob er das so wirschaftlich handhabt wie WebRequest.
    Danke für eure Antworten. Ich hab das jetzt so gelst .. hoffe ich. Ist jetzt ungetestet. Ich hab mich da von RodFromGermany inspirieren lassen :D

    so hab cihs jetzt gebastelt:

    VB.NET-Quellcode

    1. Public Class
    2. 'Globale deklaration gedöhns
    3. Dim cfilelist() As String
    4. Dim cdirlist() As String
    5. Dim files_filelist As Integer
    6. Dim dloc As String = ""
    7. Dim anzahlfiles As Integer = 0
    8. Public WithEvents wb As New System.Net.WebClient
    9. ...
    10. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    11. Button2.Enabled = False
    12. Button1.Enabled = False
    13. textinfo.Text = "Es wird nun heruntergeladen und installiert. Bitte warten..."
    14. PictureBox1.Visible = True
    15. ProgressBar1.Visible = True
    16. Try
    17. IO.Directory.Delete(dloc & "\setup", True)
    18. Catch
    19. End Try
    20. For Each createdir As String In cdirlist
    21. Try
    22. IO.Directory.CreateDirectory(dloc & "\setup\" & createdir)
    23. Catch
    24. MsgBox("Error")
    25. End Try
    26. Next
    27. downloadschleife()
    28. End Sub
    29. Private Sub downloadschleife()
    30. If anzahlfiles > files_filelist Then
    31. MsgBox("Fertig heruntergeladen", MsgBoxStyle.Information)
    32. Else
    33. Dim prz = Int(anzahlfiles / files_filelist * 100)
    34. setupstatus.Text = "Es wird heruntergeladen und installiert: " & prz & "% Fertig"
    35. wb.DownloadFileAsync(New Uri("url/files/" & cfilelist(anzahlfiles)), dloc & "\setup\" & cfilelist(anzahlfiles))
    36. anzahlfiles = anzahlfiles + 1
    37. End If
    38. End Sub
    39. Private Sub wb_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles wb.DownloadFileCompleted
    40. downloadschleife()
    41. End Sub
    42. Private Sub wb_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles wb.DownloadProgressChanged
    43. ProgressBar1.Value = e.ProgressPercentage
    44. End Sub
    45. End Class


    Habs wie gesagt noch nicht getestet... Was sagt Ihr dazu?
    Nicht das, was mir vorschwob. :S
    Etwa so:

    VB.NET-Quellcode

    1. 'Form-Klasse:
    2. Dim dlc As New DownloadClass
    3. For Each file As String In MyFileList
    4. dlc.Download(file)
    5. Next

    VB.NET-Quellcode

    1. Friend Class DownloadClass
    2. ' Member BackgroundWorker
    3. Public Sub Download(file As String)
    4. ' Backgroundworker anschuppen
    5. End Sub
    6. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok.. Jetzt fuinzt alles.. Nur irgendwie nicht mehr die Progressbar :D
    da ich einige dateien nur per ftp erreiche, warum auch immer... musste ich anstatt file/filename
    ftp nutzen. Sprich benutzer:pw@server.de/files/file.

    Die Files werden gedownloadet. Sogar richtig. Aber die progressbar funktioniert nicht -.- nur wenn ich http benutze. Aber da bekomm ich bei einigen files das not found..

    Wieso funktioniert die progressbar mit downloadfileasyn nicht, wenn ich ftp benutze?

    mfg ben