Multidownloader mit Progressbar

    • VB.NET

    Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von KaskadekingDE.

      Multidownloader mit Progressbar

      Guten Tag ,

      ich möchte euch nun zeigen wie ihr einen Multidownloader mit Progressbar erstellt.

      Ganz am anfang Importiert ihr folgendes :

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO


      Als nächstes Definieren wir erstmal alle Variablen :

      EDIT// Hier eine kleine änderung

      VB.NET-Quellcode

      1. Public Class Form1
      2. Withevents WebClient1 as New Net.WebClient ' Für das WebClient steuerelement mit Events z.b. DownloadProgressChanged...
      3. Dim sLine As String ' Für die Zeilen der Textdatei
      4. Dim oStream As IO.StreamReader ' Zum auslesen der Textdatei
      5. Dim gesendet As Integer ' Bytes die gesendet wurden
      6. Dim gesammt As Integer ' Bytes gesammt der Datei
      7. Dim titel As String = "Multidownloader " ' Fenstertitel


      So das Form_Load ereigniss :

      VB.NET-Quellcode

      1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      2. lblstatus.Text = "" ' Setzt den Status Text auf "" also nichts
      3. lblname.Visible = False ' Macht das lblname Label unsichtbar weil es nur für den Code gebraucht wird.
      4. Me.Text = titel & " © by ChRoNiK" ' Fenstertitel ändern
      5. bg.RunWorkerAsync() ' Backgroundworker starten der die Dateien in einem anderem Thread downloadet um einfrieren des Programms zu verhindern während des Downloads
      6. End Sub


      Das haben wir dann schonmal als nächstes der Quelltext vom Backgroundworker :

      VB.NET-Quellcode

      1. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bg.DoWork
      2. If My.Computer.FileSystem.FileExists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\update.txt") Then ' Prüfen ob Datei vorhanden ist
      3. My.Computer.FileSystem.DeleteFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\update.txt") ' Wenn ja löschen
      4. End If
      5. My.Computer.Network.DownloadFile("http://g6d.g6.funpic.de/update.txt", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\update.txt") 'Datei downloaden mit den Links
      6. Dim leser As String ' Eine neue Variable erstellen mit dem namen leser des Typs String
      7. leser = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\update.txt" 'Speichert den Pfad zur Datei in die Variable leser.
      8. Dim oFile As New IO.FileInfo(leser) ' Holt sich die Infos über die Datei !
      9. If oFile.Exists() = True Then ' Wenn die Datei "update.txt" existiert dann..
      10. oStream = New IO.StreamReader(leser) 'Datei zum lesen auswählen
      11. ' Datei zeilenweise auslese
      12. Do
      13. If WebClient1.IsBusy = True Then ' wenn webclient1 schon am arbeiten ist dann
      14. ''''nichts machen
      15. Else ' Falls nicht
      16. sLine = oStream.ReadLine() 'Nächste Zeile der Textdatei lesen
      17. If IsNothing(sLine) Then MessageBox.Show("Keine weiteren Dateien zum Download verfügbar") ' Wenn die Zeile Leer ist dann Messagebox zur Info anzeigen
      18. Dim uri As New Uri(sLine) 'URL für den Webclient setzen mit dem Link aus der Zeile der Textdatei.
      19. Dim dateiname As String = IO.Path.GetFileName(sLine) 'Den dateinamen holen von der Datei die gedownloadet werden soll.
      20. lblname.Text = dateiname 'Dem Label "lblname" den Dateinamen als Text geben.
      21. WebClient1.DownloadFileAsync(uri, My.Computer.FileSystem.CurrentDirectory & "\" & dateiname) ' Den Download der Datei starten.
      22. End If
      23. Loop
      24. oStream.Close() 'wenn alles fertig lesen schließen
      25. End If
      26. End Sub


      So und was jetzt noch fehlt für die Progressbar :

      VB.NET-Quellcode

      1. Private Sub WebClient1_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient1.DownloadProgressChanged
      2. gesendet = e.BytesReceived 'Die gesendetem Bytes in der Variable gesendet speichern
      3. gesammt = e.TotalBytesToReceive 'Die gesammten Bytes in die Variable gesammt speichern
      4. lblstatus.Text = gesendet & " von " & gesammt & " empfangen. Dateiname : " & lblname.Text 'Status anzeigen
      5. Me.Text = titel & " " & e.ProgressPercentage & " % von " & lblname.Text 'Fenstertitel ändern
      6. ProgressBar1.Value = e.ProgressPercentage 'Progressbar füllen.
      7. End Sub


      Ich denke der Source ist fast selbstverständlich.

      Die Text datei muss so aussehen :

      VB.NET-Quellcode

      1. http://g6d.g6.funpic.de/Spirit.exe
      2. http://g6d.g6.funpic.de/serverinfo.rar
      3. http://g6d.g6.funpic.de/Setup ChRoNiK Player.rar


      In jeder Zeile ein Downloadlink.

      Verbesserungs Vorschläge gern gesehen. ;)

      Mfg

      ChRoNiK

      edit by nicgenie://
      Rot ist für Mods
      Grüße , xChRoNiKx

      Nützliche Links:
      Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nicgenie“ () aus folgendem Grund: Code verbesserung ;)

      Hey ich habe 3 Probleme kannste du mir helfen

      Quellcode

      1. Fehler 1 Der Name "WebClient1" wurde nicht deklariert. C:\Users\Cem\Documents\Visual Studio 2008\Projects\Cod 6 Launcher V.1.0\Cod 6 Launcher V.1.0\Form3.vb 30 20 Cod 6 Launcher V.1.0
      2. Fehler 2 Der Name "WebClient1" wurde nicht deklariert. C:\Users\Cem\Documents\Visual Studio 2008\Projects\Cod 6 Launcher V.1.0\Cod 6 Launcher V.1.0\Form3.vb 39 21 Cod 6 Launcher V.1.0
      3. Fehler 3 Das Ereignis "DownloadProgressChanged" wurde nicht gefunden. C:\Users\Cem\Documents\Visual Studio 2008\Projects\Cod 6 Launcher V.1.0\Cod 6 Launcher V.1.0\Form3.vb 49 153 Cod 6 Launcher V.1.0

      cem123 schrieb:

      Hey ich habe 3 Probleme kannste du mir helfen

      Quellcode

      1. Fehler 1 Der Name "WebClient1" wurde nicht deklariert. C:\Users\Cem\Documents\Visual Studio 2008\Projects\Cod 6 Launcher V.1.0\Cod 6 Launcher V.1.0\Form3.vb 30 20 Cod 6 Launcher V.1.0
      2. Fehler 2 Der Name "WebClient1" wurde nicht deklariert. C:\Users\Cem\Documents\Visual Studio 2008\Projects\Cod 6 Launcher V.1.0\Cod 6 Launcher V.1.0\Form3.vb 39 21 Cod 6 Launcher V.1.0
      3. Fehler 3 Das Ereignis "DownloadProgressChanged" wurde nicht gefunden. C:\Users\Cem\Documents\Visual Studio 2008\Projects\Cod 6 Launcher V.1.0\Cod 6 Launcher V.1.0\Form3.vb 49 153 Cod 6 Launcher V.1.0
      Ganz oben am anfang des Codes :

      Withevents WebClient1 as New Net.Webclient.

      Mfg
      Grüße , xChRoNiKx

      Nützliche Links:
      Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
      Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lblStatus erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

      Hab's selbst hinbekomm:

      Delegate Sub setintcallback(ByVal [int] As Integer)

      Private Sub setinteger(ByVal [int] As Integer)

      If ProgressBarX1.InvokeRequired Then
      Dim d As New setintcallback(AddressOf setinteger)
      Me.Invoke(d, New Object() {[int]})
      Else
      ProgressBarX1.Value = [int]
      End If
      End Sub

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hawk1337“ ()

      Hallo!

      Wollte auch gerade den Downloader ausprobieren, habe aber leider nach dem Start folgende Fehlermeldung bekommen:

      Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lblName erfolgt von einem anderen Thread als dem Thread, für den erstellt wurde.

      Hier vielleicht eine Idee? Die Sub von Hawk1337 hatte leider auch nicht geholfen... :(


      Mein VB-Code dazu:

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Public Class frmMain
      4. WithEvents WebClient1 As New Net.WebClient ' Für das WebClient steuerelement mit Events z.b. DownloadProgressChanged...
      5. Dim ProgrammPfad As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath)
      6. Dim sLine As String ' Für die Zeilen der Textdatei
      7. Dim oStream As IO.StreamReader ' Zum auslesen der Textdatei
      8. Dim gesendet As Integer ' Bytes die gesendet wurden
      9. Dim gesammt As Integer ' Bytes gesammt der Datei
      10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      11. lblStatus.Text = "" ' Setzt den Status Text auf "" also nichts
      12. lblName.Text = "" ' Setzt den Name Text auf "" also nichts
      13. 'lblName.Visible = False ' Macht das lblname Label unsichtbar weil es nur für den Code gebraucht wird.
      14. 'bgwrkDownload.RunWorkerAsync() ' Backgroundworker starten der die Dateien in einem anderem Thread downloadet um einfrieren des Programms zu verhindern während des Downloads
      15. End Sub
      16. Private Sub cmdUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdUpdate.Click
      17. bgwrkDownload.RunWorkerAsync() ' Backgroundworker starten der die Dateien in einem anderem Thread downloadet um einfrieren des Programms zu verhindern während des Downloads
      18. End Sub
      19. Private Sub bgwrkDownload_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwrkDownload.DoWork
      20. Try
      21. If My.Computer.FileSystem.FileExists(ProgrammPfad & "\update.txt") Then ' Prüfen ob Datei vorhanden ist
      22. My.Computer.FileSystem.DeleteFile(ProgrammPfad & "\update.txt") ' Wenn ja löschen
      23. End If
      24. My.Computer.Network.DownloadFile("http://www.rofl.de/update.txt", ProgrammPfad & "\update.txt") 'Datei downloaden mit den Links
      25. Dim leser As String = ProgrammPfad & "\update.txt" 'Speichert den Pfad zur Datei in die Variable leser.
      26. Dim oFile As New IO.FileInfo(leser) ' Holt sich die Infos über die Datei !
      27. If oFile.Exists() = True Then ' Wenn die Datei "update.txt" existiert dann..
      28. oStream = New IO.StreamReader(leser) 'Datei zum lesen auswählen
      29. ' Datei zeilenweise auslese
      30. Do
      31. If WebClient1.IsBusy = True Then ' wenn webclient1 schon am arbeiten ist dann
      32. ' nichts machen
      33. Else ' Falls nicht
      34. sLine = oStream.ReadLine() 'Nächste Zeile der Textdatei lesen
      35. If IsNothing(sLine) Then MsgBox("Keine weiteren Dateien zum Download verfügbar") ' Wenn die Zeile Leer ist dann Messagebox zur Info anzeigen
      36. Dim uri As New Uri(sLine) 'URL für den Webclient setzen mit dem Link aus der Zeile der Textdatei.
      37. Dim dateiname As String = IO.Path.GetFileName(sLine) 'Den dateinamen holen von der Datei die gedownloadet werden soll.
      38. lblName.Text = dateiname 'Dem Label "lblname" den Dateinamen als Text geben.
      39. WebClient1.DownloadFileAsync(uri, ProgrammPfad & "\new_" & dateiname) ' Den Download der Datei starten.
      40. End If
      41. Loop
      42. oStream.Close() 'wenn alles fertig lesen schließen
      43. End If
      44. Catch ex As Exception
      45. MsgBox("Fehler: " & ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "FEHLER!!!")
      46. End Try
      47. End Sub
      48. Private Sub WebClient1_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient1.DownloadProgressChanged
      49. Try
      50. gesendet = e.BytesReceived 'Die gesendetem Bytes in der Variable gesendet speichern
      51. gesammt = e.TotalBytesToReceive 'Die gesammten Bytes in die Variable gesammt speichern
      52. lblStatus.Text = gesendet & " von " & gesammt & " empfangen. Dateiname : " & lblName.Text 'Status anzeigen
      53. prgbarDownload.Value = e.ProgressPercentage 'Progressbar füllen.
      54. Catch ex As Exception
      55. MsgBox("Fehler: " & ex.Message, MsgBoxStyle.Critical Or MsgBoxStyle.OkOnly, "FEHLER!!!")
      56. End Try
      57. End Sub
      58. End Class

      VB.NET-Quellcode

      1. Delegate Sub settextcallback(ByVal [text] As string)
      2. Private Sub settext(ByVal [text] As string)
      3. If lblstatus.InvokeRequired Then
      4. Dim d As New settextcallback(AddressOf settext)
      5. Me.Invoke(d, New Object() {[text]})
      6. Else
      7. lblstatus.Text = [text]
      8. End If
      9. End Sub
      Ok, Danke Hawk1337, jetzt gehts. Bedingt durch die Hitze war ich zu blöd die Sub korrekt einzubinden :)


      Als Ergänzung an den TS hätte ich aber noch folgenden Verbesserungsvorschlag:

      VB.NET-Quellcode

      1. ... = oStream.ReadLine() 'Nächste Zeile der Textdatei lesen
      2. If IsNothing(sLine) Then
      3. MsgBox("Keine weiteren Dateien zum Download verfügbar!" & "Bitte warten Sie, bis der Download abgeschlossen ist!", MsgBoxStyle.Information Or MsgBoxStyle.OkOnly) ' Wenn die Zeile Leer ist dann Messagebox zur Info anzeigen
      4. Exit Do ' Schleifen beenden, da da keine weiteren Dateien zum Download zur Verfügung stehen
      5. End If
      6. Dim uri As New...


      Weil ohne das "Exit Do" kommt eine Fehlermeldung, dass URI nicht gleich leer sein darf!
      so sieht mein ganzer Code von der Form aus:

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Public Class updater
      4. WithEvents WebClient1 As New Net.WebClient ' Für das WebClient steuerelement mit Events z.b. DownloadProgressChanged...
      5. Dim sLine As String ' Für die Zeilen der Textdatei
      6. Dim oStream As IO.StreamReader ' Zum auslesen der Textdatei
      7. Dim gesendet As Integer ' Bytes die gesendet wurden
      8. Dim gesammt As Integer ' Bytes gesammt der Datei
      9. Dim titel As String = "Multidownloader " ' Fenstertitel
      10. Private Sub updater_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
      11. lblstatus.Text = "" ' Setzt den Status Text auf "" also nichts
      12. lblname.Visible = False ' Macht das lblname Label unsichtbar weil es nur für den Code gebraucht wird.
      13. Me.Text = titel ' Fenstertitel ändern
      14. downloadBackgroundWorker.RunWorkerAsync() ' Backgroundworker starten der die Dateien in einem anderem Thread downloadet um einfrieren des Programms zu verhindern während des Downloads
      15. End Sub
      16. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles downloadBackgroundWorker.DoWork
      17. If My.Computer.FileSystem.FileExists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\update.txt") Then ' Prüfen ob Datei vorhanden ist
      18. My.Computer.FileSystem.DeleteFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\update.txt") ' Wenn ja löschen
      19. End If
      20. My.Computer.Network.DownloadFile("http://link.de/update.txt", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\update.txt") 'Datei downloaden mit den Links
      21. Dim leser As String ' Eine neue Variable erstellen mit dem namen leser des Typs String
      22. leser = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\update.txt" 'Speichert den Pfad zur Datei in die Variable leser.
      23. Dim oFile As New IO.FileInfo(leser) ' Holt sich die Infos über die Datei !
      24. If oFile.Exists() = True Then ' Wenn die Datei "update.txt" existiert dann..
      25. oStream = New IO.StreamReader(leser) 'Datei zum lesen auswählen
      26. ' Datei zeilenweise auslese
      27. Do
      28. If WebClient1.IsBusy = True Then ' wenn webclient1 schon am arbeiten ist dann
      29. ''''nichts machen
      30. Else ' Falls nicht
      31. sLine = oStream.ReadLine() 'Nächste Zeile der Textdatei lesen
      32. If IsNothing(sLine) Then MessageBox.Show("Keine weiteren Dateien zum Download verfügbar") ' Wenn die Zeile Leer ist dann Messagebox zur Info anzeigen
      33. Dim uri As New Uri(sLine) 'URL für den Webclient setzen mit dem Link aus der Zeile der Textdatei.
      34. Dim dateiname As String = IO.Path.GetFileName(sLine) 'Den dateinamen holen von der Datei die gedownloadet werden soll.
      35. lblname.Text = dateiname 'Dem Label "lblname" den Dateinamen als Text geben.
      36. WebClient1.DownloadFileAsync(uri, My.Computer.FileSystem.CurrentDirectory & "\" & dateiname) ' Den Download der Datei starten.
      37. End If
      38. Loop
      39. oStream.Close() 'wenn alles fertig lesen schließen
      40. End If
      41. End Sub
      42. Private Sub WebClient1_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient1.DownloadProgressChanged
      43. gesendet = e.BytesReceived 'Die gesendetem Bytes in der Variable gesendet speichern
      44. gesammt = e.TotalBytesToReceive 'Die gesammten Bytes in die Variable gesammt speichern
      45. lblstatus.Text = gesendet & " von " & gesammt & " empfangen. Dateiname : " & lblname.Text 'Status anzeigen
      46. Me.Text = titel & " " & e.ProgressPercentage & " % von " & lblname.Text 'Fenstertitel ändern
      47. ProgressBar1.Value = e.ProgressPercentage 'Progressbar füllen.
      48. End Sub
      49. Private Sub updater_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      50. End Sub
      51. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      52. downloadBackgroundWorker.CancelAsync()
      53. Me.Close()
      54. End Sub
      55. End Class

      aligator schrieb:

      ich würd sagen im load-event


      dan kommt dieser Fehler:

      Fehler 1 "CheckForIllegalCrossThreads" ist kein Member von "System.Windows.Forms.Control".


      EDIT:

      Habs jetzt in einer einzell Anwendung gemacht und jetzt geht es.

      Ist ein Super Tutorial und hat mir sehr geholfen.

      danke

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „pc-freack“ ()

      du könntest eine Boolean-Variable nehmen und wenn diese auf True ist eine Endlos-Schleife laufen lassen, damit es nicht weitergeht:

      VB.NET-Quellcode

      1. 'Pseudo:
      2. Pause = Falsch
      3. Download Start
      4. While Pause : While End
      5. ' sth. to download
      6. Download End
      darf der link in der textdatei Leerzeichen enthalten?

      Weil wenn ich den Downloader Starte, kommt diese Fehlermeldung:

      VB.NET-Quellcode

      1. Fehler: Illegales Zeichen im Pfad


      ich hoffe, ihr könnt mir weiter helfen.
      Wenn es keine Leerzeichen geben darf, mit welche Zeichen muss ich sie dan ersetzen?