Multi Download

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Nanoxx.

    Multi Download

    Hey,


    Ich habe hier ein code der nicht funktioniert und kann das problem nicht lösen...

    ListBox1

    Quellcode

    1. Public Class Down
    2. Private WithEvents NORM as WebClient
    3. Private Sub SPIN_PATCH_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. If LostBox1.Items.Count = 0 Then
    5. MsgBox("Fertig")
    6. else
    7. ListBox1.Selected Index = 0
    8. Norm.DownloadFileAsync(New Uri(ListBox1.SelectedItem),(".\Data\"))
    9. While NORM.IsBusy
    10. Application.DoEvents() '<- In dieser Schleife bleibt das Programm beim zweiten Download stehen und es wird eine 0-Byte große Datei erstellt.
    11. End While
    12. end if
    13. End Sub


    Mein Problem ist: es wird kein eintrag aus der listbox ausgewählt

    kann mir da einer sagen wie ich das löse?


    Topic verschoben

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nanoxx“ ()

    Hallo,

    @Nanoxx für was benötigst du eigentlich diese Schleife?

    VB.NET-Quellcode

    1. While NORM.IsBusy
    2. Application.DoEvents() '<- In dieser Schleife bleibt das Programm beim zweiten Download stehen und es wird eine 0-Byte große Datei erstellt.
    3. End While

    Die DownloadFileAsync-Methode macht den Download ja gerade asynchron, damit die Form nicht einfriert.

    Einen Eintrag in einer Listbox selektierst du folgendermaßen:

    VB.NET-Quellcode

    1. 'Name der Listbox.SelectedIndex = gewünschter Index (0 = erstes Item in Listbox)
    2. ListBox1.SelectedIndex = 0

    Vielleicht hat es nicht funktioniert, weil du ein Leerzeichen zwischen Selected und Index hast. Und du hast in Zeile 6 LostBox1 statt ListBox1 geschrieben :)

    Ansonsten mach mal Option Strict On, damit du sauberer programmierst.

    Hier mal ein kleines Beispiel für den Download:

    VB.NET-Quellcode

    1. Private Sub SPIN_PATCH_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. If ListBox1.Items.Count = 0 Then
    3. 'nicht MsgBox("BlaBla") das ist veraltet
    4. MessageBox.Show("Fertig")
    5. Else
    6. Dim NORM As New WebClient
    7. ListBox1.SelectedIndex = 0
    8. 'hinzufügen des Handlers -> MessageBox bei Abschluss des Downloads
    9. AddHandler NORM.DownloadFileCompleted, AddressOf DownloadCompleted
    10. NORM.DownloadFileAsync(New Uri(ListBox1.SelectedItem.ToString), (".\Data\"))
    11. End If
    12. End Sub
    13. Private Sub DownloadCompleted(sender As System.Object, e As System.ComponentModel.AsyncCompletedEventArgs)
    14. MessageBox.Show("Vollständig heruntergeladen!")
    15. End Sub

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom

    Quellcode

    1. Private WithEvents DLLA As WebClient
    2. '''''DOWNLOAD
    3. Private Sub PatcherPatch()
    4. DLLA = New WebClient
    5. If Filesee.Items.Count = "0" Then
    6. MsgBox("Download erfolreich!" & vbNewLine & "", MsgBoxStyle.Information, ("Download erfolgreich!"))
    7. Else
    8. Try
    9. '########################
    10. ListBox1.SelectedIndex = 0
    11. DLLA.DownloadFileAsync(New Uri(ListBox1.SelectedItem), (".\pack\"))
    12. '########################
    13. While DLLA.IsBusy
    14. Application.DoEvents() '<- In dieser Schleife bleibt das Programm beim zweiten Download stehen und es wird eine 0-Byte große Datei erstellt.
    15. End While
    16. Catch ex As Exception
    17. STATUS_TEXT.Text = "SERVER FEHLER@11"
    18. MsgBox("DOWNLOAD SERVER FEHLER!@11", MsgBoxStyle.Critical, "FEHLER@11")
    19. End Try
    20. End If
    21. End Sub
    22. Private Sub DLLA_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles DLLA.DownloadFileCompleted
    23. ListBox1.Items.Remove(Filesee.SelectedItem)
    24. PatcherPatch()
    25. End Sub



    Si sieht das eigentlich aus....
    er soll die einträge der listbox nacheinander downloaden

    geht aber nicht bzw downloaded nicht und removt alle einträge aufeinmal ;(

    da brauche ich hilfe

    wenn du skype hast nzw lust hast mir zu helfen dann sag mir mal deinen skype namen :)
    Hallo @Nanoxx,

    Ich würde dir viel lieber helfen, wenn du das, was ich in meinem vorherigen Post geschrieben habe, auch umgesetzt hättest. Die Schleife ist immer noch im Code (Die mit Application.DoEvents) und auch Option Strict On hast du immer noch nicht in die erste Zeile des Codes geschrieben. Dazu steht immer noch MsgBox im Code.

    @Nanoxx Dein Problem können wir auch hier im Forum lösen. Dann profitiert vielleicht noch ein anderer von der Lösung :) .

    Wenn du jedes Item aus einer Listbox downloaden willst, würde ich das mit einer For-Schhleife.

    Kleines Beispiel:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net
    3. Public Class Form1
    4. Private Sub SPIN_PATCH_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. If ListBox1.Items.Count = 0 Then
    6. MessageBox.Show("Fertig")
    7. Else
    8. For i = ListBox1.Items.Count - 1 To 0 Step -1
    9. Dim NORM As New WebClient
    10. 'Handler hinzufügen
    11. AddHandler NORM.DownloadFileCompleted, AddressOf DownloadCompleted
    12. 'Upload
    13. NORM.DownloadFileAsync(New Uri(ListBox1.Items.Item(i).ToString), (".\Data\"))
    14. 'Löschen des Items
    15. ListBox1.Items.RemoveAt(i)
    16. Next
    17. End If
    18. End Sub
    19. Private Sub DownloadCompleted(sender As System.Object, e As System.ComponentModel.AsyncCompletedEventArgs)
    20. MessageBox.Show("Vollständig heruntergeladen")
    21. End Sub
    22. End Class

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    @Nanoxx:
    Mach Dir gleich ein richtiges Multi-Download. Gugst Du hier.
    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!

    Switcherlapp97 schrieb:

    Hallo @Nanoxx,

    Ich würde dir viel lieber helfen, wenn du das, was ich in meinem vorherigen Post geschrieben habe, auch umgesetzt hättest. Die Schleife ist immer noch im Code (Die mit Application.DoEvents) und auch Option Strict On hast du immer noch nicht in die erste Zeile des Codes geschrieben. Dazu steht immer noch MsgBox im Code.

    @Nanoxx Dein Problem können wir auch hier im Forum lösen. Dann profitiert vielleicht noch ein anderer von der Lösung :) .

    Wenn du jedes Item aus einer Listbox downloaden willst, würde ich das mit einer For-Schhleife.


    Ja problem ist das die items aus der listbox gelöscht und runtergeladen werden aber halt alle unter dem selben namen....
    (jeder download wird dann überschrieben)

    es müsste aber der dateiname sein der auch im link steht bzw. google.de/eine199.exe

    dann soll es in .\Data gespeichert werden also

    .\Data\eine199.exe
    @Nanoxx
    Dann zählst du die "/" im Link. Das ist die Funktion:

    VB.NET-Quellcode

    1. Function ZeichenZählen(ByVal strText As String, ByVal Zeichen As String) As Integer
    2. 'Funktionsaufruf = ZeichenZählen(Bereich;Zeichen)
    3. Dim I As Integer
    4. Dim Anzahl As Integer
    5. Dim str As String
    6. ZeichenZählen = 0
    7. I = 1
    8. Do While I <= Len(strText)
    9. Anzahl = InStr(I, strText, Zeichen)
    10. If Anzahl > 0 Then
    11. I = Anzahl + 1
    12. ZeichenZählen = ZeichenZählen + 1
    13. str = ZeichenZählen.ToString
    14. Else
    15. Exit Do
    16. End If
    17. Loop
    18. Return str
    19. End Function

    So wird sie verwendet:

    VB.NET-Quellcode

    1. Dim i As Integer = ZeichenZählen(Listbox1.SelectedItem.ToString, "/")

    Dann den Link Splitten:

    VB.NET-Quellcode

    1. Dim linkspl() As String = Split(ListBox1.SelectedItem.ToString, "/")

    Nun ist der Dateiname im linkspl-Array gespeichert. Logischerweise im Letzten String des Stringarrays. Dadurch das dein Beispiel-Link (google.de/eine199.exe) 3 Schrägstriche beinhaltet, sind im Array vier Strings. Der letzte ist unser Dateiname. Dieser String hätte dann den Index 3. Also genau den Wert vom ZeichenZählen. Wenn kein Doppel-Schrägstrich im Link vorkommt, wäre der Index ZeichenZählen - 1

    Und jetzt nur noch in eine Variable packen:

    VB.NET-Quellcode

    1. Dim filename As String = linkspl(i)

    Das musst du in der For-Schleife aus meinem letzten Post die Zeilen nur noch hinzufügen und beim Download-Speicherort dann hald statt ".\Data" eben Path.Combine("Zielordner", filename)

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom