Multidownloader mit Progressbar

    • VB.NET

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

      Ersetze Leerzeichen mit einem "_" (untenstrich) aber eigentlich dürfte es keine Probleme geben... ansonsten schau das dein Programm den DL Link automatisch nach leerzeichen sucht und diese durch "%20" ersetzt.

      Mfg
      Grüße , xChRoNiKx

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

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

      bei mir kommt noch das hier



      Fehler 2 Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird. C:\Users\Cem\documents\visual studio 2010\Projects\XXX\XXX\Form10.vb 22 131 XXX

      Fehler 3 Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird. C:\Users\Cem\documents\visual studio 2010\Projects\XXX\XXX\Form10.vb 63 99 XXX

      Fehler 1 "downloadBackgroundWorker" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden. C:\Users\Cem\documents\visual studio 2010\Projects\XXX\XXX\Form10.vb 18 9 XXX

      Fehler 4 "downloadBackgroundWorker" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden. C:\Users\Cem\documents\visual studio 2010\Projects\XXX\XXX\Form10.vb 64 9 XXX
      1. und 2. : du musst zu der Prozedur mit der Handles-Klausel die dazu gehörige Variable mit WithEvents Spezifizierung definieren
      3. und 4. : definiere "downloadBackgroundWorker" als BackgroundWorker (vermtl. als WithEvents)
      Hi, ich versuche vergebend das script zum laufen zu bekommen
      da ich nicht wirklich viel Ahnung vom programmieren hab hab ich dwesshalb teilweise starke verständnisschwierigkeiten

      habe
      folgendes Problem für die darauf folgenden 4 Zeilen, wenn ich diese
      auskommentiere geht der rest einwandfrei ist aber nicht die Lösung :)
      :
      Ungültiger threadübergreifender Vorgang: Der Zugriff auf das
      Steuerelement lblname erfolgte von einem anderen Thread als dem Thread,
      für den es erstellt wurde.

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Public Class updater1
      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_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles updater.Click
      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://webadresse/files/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
      33. MessageBox.Show("Keine weiteren Dateien zum Download verfügbar") ' Wenn die Zeile Leer ist dann Messagebox zur Info anzeigen
      34. Exit Do ' Schleifen beenden, da da keine weiteren Dateien zum Download zur Verfügung stehen
      35. End If
      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, My.Computer.FileSystem.CurrentDirectory & "\" & dateiname) ' Den Download der Datei starten.
      40. End If
      41. Loop
      42. oStream.Close() 'wenn alles fertig lesen schließen
      43. End If
      44. End Sub
      45. Private Sub WebClient1_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient1.DownloadProgressChanged
      46. gesendet = e.BytesReceived 'Die gesendetem Bytes in der Variable gesendet speichern
      47. gesammt = e.TotalBytesToReceive 'Die gesammten Bytes in die Variable gesammt speichern
      48. lblstatus.Text = gesendet & " von " & gesammt & " empfangen. Dateiname : " & lblname.Text 'Status anzeigen
      49. Me.Text = titel & " " & e.ProgressPercentage & " % von " & lblname.Text 'Fenstertitel ändern
      50. ProgressBar1.Value = e.ProgressPercentage 'Progressbar füllen.
      51. End Sub
      52. Private Sub updater_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      53. End Sub
      54. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      55. downloadBackgroundWorker.WorkerSupportsCancellation() = True
      56. downloadBackgroundWorker.CancelAsync()
      57. Me.Close()
      58. End Sub
      59. End Class


      Ich hoffe mir kann da wer helfen, versuche schon seit wochen so einen multidownloader zu machen hab auch schon eines geschafft gehabt aber das blockierte bei größeren dateien immer sodass der abbrech button immer 2x gedrückt werden musste.
      Dieses Script hier finde ich da schon etwas besser :) wenn dieses genannte Problem nicht wäre ^^

      bb Dainara

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

      KaskadekingDE on GitHub :)
      Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

      Who cares? ¯\_(ツ)_/¯

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

      Hallo, danke für den Link, dort war ich schon hab auch schon krampfhaft versucht das irgendwie einzubauen aber ich schaffe es nicht, deshalb hab ich hier gepostet in der Hoffnung dass mir da jemand bisschen unter die arme greifen kann, ich weis dass copy past system ist schlecht weil man da nicht viel dabei lernt, nur brauch ich dieses script und kenne niemanden der mir das machen kann, so versuche ich mich halt selbst daran ohne Grundkenntnisse und in dem kleinen tool ist alles soweit fertig bis auf dieser Multidownloader und ich komme nicht weiter :(
      Ob das nun sicher ist oder nicht steht in diesem zusammenhang erstmal nicht zur debatte. Mir ist bewusst dass es ganz und garnicht sicher ist.

      habs erstmal versucht mit einem zum laufen zu bekommen darum hab ich den rest auskommentiert
      hab 2 Varianten davon versucht einzubauen, das problem ist dass ich dann keine Anzeige habe, weil ich nicht weis wie ich die Informationen zu HIER HER hin bekomme

      VB.NET-Quellcode

      1. Private Sub ThreadProcSafe()
      2. Me.SetText("HIER HER")
      3. 'Me.SetInteger()
      4. End Sub


      hier nochmal das script
      die update2.txt beinhaltet die endnamen wie die dateien heissen sollen das funktiniert auchsoweit erstmal nur hab ich eben keine anzeige was gemacht wird und wie weit es ist

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Imports System.ComponentModel
      4. Imports System.Threading
      5. Imports System.Drawing
      6. Public Class updater1
      7. WithEvents WebClient1 As New Net.WebClient ' Für das WebClient steuerelement mit Events z.b. DownloadProgressChanged...
      8. Dim sLine As String ' Für die Zeilen der Textdatei
      9. Dim sLine2 As String ' Für die Zeilen der Textdatei
      10. Dim oStream As IO.StreamReader ' Zum auslesen der Textdatei
      11. Dim oStream2 As IO.StreamReader ' Zum auslesen der Textdatei
      12. Dim gesendet As Integer ' Bytes die gesendet wurden
      13. Dim gesammt As Integer ' Bytes gesammt der Datei
      14. Dim titel As String = "Multidownloader " ' Fenstertitel
      15. 'Private WithEvents setTextSafeBtn As Button
      16. Delegate Sub SetTextCallback(ByVal [text] As String)
      17. Delegate Sub SetIntCallback(ByVal [int] As Integer)
      18. Private demoThread As Thread = Nothing
      19. Private Sub setTextSafeBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles setTextSafeBtn.Click
      20. Me.demoThread = New Thread(New ThreadStart(AddressOf Me.ThreadProcSafe))
      21. Me.demoThread.Start()
      22. End Sub
      23. Private Sub ThreadProcSafe()
      24. Me.SetText("test")
      25. End Sub
      26. Private Sub SetText(ByVal [text] As String)
      27. If Me.lblname.InvokeRequired Then
      28. Dim d As New SetTextCallback(AddressOf SetText)
      29. Me.Invoke(d, New Object() {[text]})
      30. Me.lblname.Text = [text]
      31. Else
      32. Me.lblname.Text = [text]
      33. End If
      34. End Sub
      35. Private Sub updater_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles updater.Click
      36. Me.demoThread = New Thread(New ThreadStart(AddressOf Me.ThreadProcSafe))
      37. Me.demoThread.Start()
      38. lblstatus.Text = "" ' Setzt den Status Text auf "" also nichts
      39. lblname.Visible = False ' Macht das lblname Label unsichtbar weil es nur für den Code gebraucht wird.
      40. Me.Text = titel ' Fenstertitel ändern
      41. downloadBackgroundWorker.RunWorkerAsync() ' Backgroundworker starten der die Dateien in einem anderem Thread downloadet um einfrieren des Programms zu verhindern während des Downloads
      42. End Sub
      43. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles downloadBackgroundWorker.DoWork
      44. If My.Computer.FileSystem.FileExists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\cw\update.txt") Then ' Prüfen ob Datei vorhanden ist
      45. My.Computer.FileSystem.DeleteFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\cw\update.txt") ' Wenn ja löschen
      46. End If
      47. If My.Computer.FileSystem.FileExists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\cw\update2.txt") Then ' Prüfen ob Datei vorhanden ist
      48. My.Computer.FileSystem.DeleteFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\cw\update2.txt") ' Wenn ja löschen
      49. End If
      50. My.Computer.Network.DownloadFile("http://HPLINK/update.txt", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\cw\update.txt") 'Datei downloaden mit den Links
      51. My.Computer.Network.DownloadFile("http://HPLINK/update2.txt", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\cw\update2.txt") 'Datei downloaden mit den Links
      52. Dim leser As String ' Eine neue Variable erstellen mit dem namen leser des Typs String
      53. leser = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cw\update.txt" 'Speichert den Pfad zur Datei in die Variable leser.
      54. Dim oFile As New IO.FileInfo(leser) ' Holt sich die Infos über die Datei !
      55. Dim leser2 As String ' Eine neue Variable erstellen mit dem namen leser des Typs String
      56. leser2 = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\cw\update2.txt" 'Speichert den Pfad zur Datei in die Variable leser2.
      57. Dim oFile2 As New IO.FileInfo(leser2) ' Holt sich die Infos über die Datei !
      58. If oFile.Exists() = True Then ' Wenn die Datei "update.txt" existiert dann..
      59. oStream = New IO.StreamReader(leser) 'Datei zum lesen auswählen
      60. oStream2 = New IO.StreamReader(leser2) 'Datei zum lesen auswählen
      61. ' Datei zeilenweise auslese
      62. Do
      63. If WebClient1.IsBusy = True Then ' wenn webclient1 schon am arbeiten ist dann
      64. ''''nichts machen
      65. Else ' Falls nicht
      66. sLine = oStream.ReadLine() 'Nächste Zeile der Textdatei lesen
      67. sLine2 = oStream2.ReadLine() 'Nächste Zeile der Textdatei lesen
      68. If IsNothing(sLine) Then
      69. MessageBox.Show("Keine weiteren Dateien zum Download verfügbar") ' Wenn die Zeile Leer ist dann Messagebox zur Info anzeigen
      70. Exit Do ' Schleifen beenden, da da keine weiteren Dateien zum Download zur Verfügung stehen
      71. End If
      72. Dim uri As New Uri(sLine) 'URL für den Webclient setzen mit dem Link aus der Zeile der Textdatei.
      73. Dim dateiname As String = IO.Path.GetFileName(sLine) 'Den dateinamen holen von der Datei die gedownloadet werden soll.
      74. Dim dateiname2 As String = IO.Path.GetFileName(sLine2) 'Den dateinamen holen von der Datei die gedownloadet werden soll.
      75. If Me.lblname.InvokeRequired Then
      76. Dim d As New SetTextCallback(AddressOf SetText)
      77. Me.Invoke(d, New Object() {[Text]})
      78. Else
      79. Me.lblname.Text = [Text]
      80. 'Me.lblname.Text = dateiname2 'Dem Label "lblname" den Dateinamen als Text geben.
      81. End If
      82. If File.Exists(My.Computer.FileSystem.CurrentDirectory & "\cw\" & dateiname2) = False Then
      83. WebClient1.DownloadFileAsync(uri, My.Computer.FileSystem.CurrentDirectory & "\cw\" & dateiname2) ' Den Download der Datei starten.
      84. Else
      85. 'MessageBox.Show("Datei war schon vorhanden")
      86. End If
      87. ' WebClient1.DownloadFileAsync(uri, My.Computer.FileSystem.CurrentDirectory & "\" & dateiname) ' Den Download der Datei starten.
      88. End If
      89. Loop
      90. oStream.Close() 'wenn alles fertig lesen schließen
      91. oStream2.Close() 'wenn alles fertig lesen schließen
      92. End If
      93. End Sub
      94. Private Sub WebClient1_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WebClient1.DownloadProgressChanged
      95. gesendet = e.BytesReceived 'Die gesendetem Bytes in der Variable gesendet speichern
      96. gesammt = e.TotalBytesToReceive 'Die gesammten Bytes in die Variable gesammt speichern
      97. 'lblstatus.Text = gesendet & " von " & gesammt & " empfangen. Dateiname : " & lblname.Text 'Status anzeigen
      98. 'Me.Text = titel & " " & e.ProgressPercentage & " % von " & lblname.Text 'Fenstertitel ändern
      99. 'ProgressBar1.Value = e.ProgressPercentage 'Progressbar füllen.
      100. End Sub
      101. Private Sub updater_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      102. End Sub
      103. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      104. downloadBackgroundWorker.WorkerSupportsCancellation() = True
      105. downloadBackgroundWorker.CancelAsync()
      106. Me.Close()
      107. End Sub
      108. End Class
      Hast du den ersten Link von mir gelesen? Denn das sieht stark nach einen Updater aus.

      Richtig müsste die Sub außerdem so aussehen:

      VB.NET-Quellcode

      1. Private Sub SetText(ByVal [text] As String)
      2. If Me.lblname.InvokeRequired Then
      3. Dim d As New SetTextCallback(AddressOf SetText)
      4. Me.Invoke(d, New Object() {[text]})
      5. Else
      6. Me.lblname.Text = [text]
      7. End If
      8. End Sub


      Dann rufst du in BackgroundWorker1_DoWork die Sub so auf:

      VB.NET-Quellcode

      1. Me.SetText("LabelText")
      KaskadekingDE on GitHub :)
      Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

      Who cares? ¯\_(ツ)_/¯