Probleme bei einer Downloadschleife für mehrere Dateien

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Linkai.

    Probleme bei einer Downloadschleife für mehrere Dateien

    Hallo liebe vb-paradise Community,
    ich habe im Netz und bei Google mich tot gesucht und wende mich nun an euch.

    Ich bin zurzeit dabei ein Programm zu schreiben, welches Dateien (Textdateien, Dll's, Exe,... usw) step by step überprüft und
    falls nötig mit der aktuellen Datei ersetzt.

    Ich habe dazu eine Fileliste erstellt mit zwei Informationen:

    Pfad+name der datei ; md5 Hash

    also z.B.

    /züge.dll ; 26B7EF7142E838B886FED8159C891A10


    Ich habe ein Programm geschrieben, welches mir diese Liste erstellt und das Funktioniert ohne Probleme.
    Die liste sowie alle dateien werden auf einen Webspace hochgeladen.
    Das 2. Programm also der Updater, ist mit den nötigen Informationen und Links gefüttert, wo sich Filelist und die zu ladenden Dateien befinden.

    Am Anfangt wird die liste heruntergeladen und komplett ausgelesen in einem array.
    Als nächstes wird die Downloadfunktion aufgerufen, welche als schleife dient. Dort wird jede Zeile des Arrays in 2 Variablen gesplittet.
    Die locale Datei wird gesucht. Wenn sie nicht vorhanden ist lädt das Programm diese direkt runter. Falls vorhanden,
    wird ebenfalls der MD5 Hash ermittelt und mit dem aus der Patchliste abgeglichen

    Alles funktioniert wunderbar nur komme ich einfach nicht darauf, warum er Jede Datei trotzdem Runterlädt, obwohl sie genau gleich sind.

    hier einfach mal der Entsprechende Ausschnitt meines Codes


    VB.NET-Quellcode

    1. If My.Computer.FileSystem.FileExists(localfile) Then
    2. Label1.Text = "Datei: " & filename & " wird überpüft"
    3. hash = MD5FileHash(localfile)
    4. 'MsgBox(hash)
    5. 'MsgBox(dlhash)
    6. If hash = dlhash Then
    7. 'MsgBox(filename & " ist aktuell")
    8. Label1.Text = "Datei: " & filename & " ist aktuell"
    9. actvfile = actvfile + 1
    10. nextfile()
    11. ElseIf Not hash = dlhash Then
    12. ' MsgBox("Datei wird ersetzt")
    13. downloader2.DownloadFileAsync(New Uri(clientpath & filename), localfile)
    14. ' MsgBox(clientpath & filename)
    15. Label1.Text = filename
    16. Label1.Text = "Datei: " & filename & " wird ersetzt"
    17. End If
    18. ElseIf Not My.Computer.FileSystem.FileExists(localfile) Then
    19. 'MsgBox("Datei wird geladen")
    20. 'MsgBox(clientpath & filename)
    21. downloader2.DownloadFileAsync(New Uri(clientpath & filename), localfile)
    22. Label1.Text = "Datei: " & filename & " wird geladen"
    23. ' MsgBox(localfile)
    24. End If
    25. End If


    er führt immer die NOT aktion aus, selbst wenn der Hash gleich ist (habe beide Hashes mit 2 msgboxen verglichen)
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    Willkommen im Forum!
    - Setz dir mal nen Breakpoint in Zeile 6. Dann vergleichst du mal die 2 Hashes ob diese auch wirklich nicht gleich sind.
    - Zeile 11 benötigt kein ElseIf. Else reicht hier vollkommen
    - Selbes bei Zeile 19
    - Verwende statt My.Computer.FileSystem.FileExists -> System.IO.File.Exists (ist schöner)
    - Dieses 'nextfile()' würd ich weglassen. Baue diese Funktion so, dass wenn nicht passieren soll diese Verlassen und die nächste Datei verglichen wird (bzw. was macht nextfile genau?)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Die ersten Punkte habe ich alle schon durch. System.io.file.exists ist nur eine verschönerung wie du schon sagtest :)
    Wie du sehen kannst, habe ich 2 Msgboxen auskommentiert. Darin habe ich mir nach und nach die beiden hashes anzeigen lassen.
    Sie sind gleich und somit sollte actvfile <-- also die aktuelle datei +1 gesetzt werden und der Private sub nextfile() nochmal aufgerufen werden. Also von vorne beginnen mit der nächsten file.

    Stattdessen sagt er, das beide hashes unterschiedlich sind und beginnt mit dem Download, obwohl sie gleich sind :O

    ich poste einfach mal die komplette sub


    VB.NET-Quellcode

    1. Private Sub nextfile()
    2. line = alltext(actvfile)
    3. ProgressBar2.Value = ProgressBar2.Value + 1
    4. If line = "" Then
    5. MsgBox("Patchvorgang ist abgeschlossen", MsgBoxStyle.Information, "Spielstart erfolgt")
    6. Process.Start(m2go)
    7. Me.Close()
    8. Else
    9. Dim parts() As String = line.Split(";")
    10. Dim filename As String = parts(0)
    11. Dim dlhash As String = parts(1)
    12. ' MsgBox(filename)
    13. ' MsgBox(dlhash)
    14. Dim localfile As String = My.Computer.FileSystem.CurrentDirectory & Replace(filename, "/", "\")
    15. If My.Computer.FileSystem.FileExists(localfile) Then
    16. Label1.Text = "Datei: " & filename & " wird überpüft"
    17. hash = MD5FileHash(localfile)
    18. 'MsgBox(hash)
    19. 'MsgBox(dlhash)
    20. If hash = dlhash Then
    21. 'MsgBox(filename & " ist aktuell")
    22. Label1.Text = "Datei: " & filename & " ist aktuell"
    23. actvfile = actvfile + 1
    24. nextfile()
    25. ElseIf Not hash = dlhash Then
    26. ' MsgBox("Datei wird ersetzt")
    27. downloader2.DownloadFileAsync(New Uri(clientpath & filename), localfile)
    28. ' MsgBox(clientpath & filename)
    29. Label1.Text = filename
    30. Label1.Text = "Datei: " & filename & " wird ersetzt"
    31. End If
    32. ElseIf Not My.Computer.FileSystem.FileExists(localfile) Then
    33. 'MsgBox("Datei wird geladen")
    34. 'MsgBox(clientpath & filename)
    35. downloader2.DownloadFileAsync(New Uri(clientpath & filename), localfile)
    36. Label1.Text = "Datei: " & filename & " wird geladen"
    37. ' MsgBox(localfile)
    38. End If
    39. End If
    40. End Sub
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love:
    'alltext' stellt vermutlich das Array dar wo die ganzen Zeilen gespeichert werden.
    Somit ist es naheliegend genau dieses Array in einer Schleife durchlaufen zu lassen.

    VB.NET-Quellcode

    1. for each item in alltext
    2. ProgressBar2.Value = ProgressBar2.Value + 1
    3. Dim parts() As String = item.Split(";")
    4. Dim filename As String = parts(0)
    5. Dim dlhash As String = parts(1)
    6. ' MsgBox(filename)
    7. ' MsgBox(dlhash)
    8. Dim localfile As String = System.Io.Path.Combine(My.Computer.FileSystem.CurrentDirectory, filename)
    9. If System.IO.File.Exists(localfile) Then
    10. Label1.Text = "Datei: " & filename & " wird überpüft"
    11. hash = MD5FileHash(localfile)
    12. 'MsgBox(hash)
    13. 'MsgBox(dlhash)
    14. If hash = dlhash Then
    15. 'MsgBox(filename & " ist aktuell")
    16. Label1.Text = "Datei: " & filename & " ist aktuell"
    17. Else
    18. ' MsgBox("Datei wird ersetzt")
    19. downloader2.DownloadFileAsync(New Uri(clientpath & filename), localfile)
    20. ' MsgBox(clientpath & filename)
    21. Label1.Text = filename
    22. Label1.Text = "Datei: " & filename & " wird ersetzt"
    23. End If
    24. Else
    25. 'MsgBox("Datei wird geladen")
    26. 'MsgBox(clientpath & filename)
    27. downloader2.DownloadFileAsync(New Uri(clientpath & filename), localfile)
    28. Label1.Text = "Datei: " & filename & " wird geladen"
    29. ' MsgBox(localfile)
    30. End If
    31. next
    32. MsgBox("Patchvorgang ist abgeschlossen", MsgBoxStyle.Information, "Spielstart erfolgt")
    33. Process.Start(m2go)
    34. Me.Close()


    lg

    EDIT: was ich jedoch nicht weiß, was passiert, wenn der Downloader dieses File asyncron runterlädt und du ihm mittendrunter ein anders File zum Download gibst (was ja der Fall wäre).
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Ich habe den Fehler gefunden. xD zu dumm wie ich bin :P
    Also:

    Ich habe falsch gesplittet. Ich habe bei meinem Patchlistcreator die Strucktur:

    Dateiname ; hash

    was ich aber geplittet habe war:

    Dateiname_
    _hash

    ("_" <-- Leerzeichen zur Verdeutlichung)

    Ich hatte nun die Wahl ob ich nun " ; " splitte oder den patchlistcreator schnell ausbesser, sodass ich die Strucktur
    Dateiname;hash statt Dateiname ; Hash habe

    Klappt, Danke für die Antworten :)

    ps

    System.Io.Path.Combine(My.Computer.FileSystem.CurrentDirectory, filename)

    hätte nicht geklappt, da ich die "/" durch "\" ersetzen musste, da die einen dateien aufm server Liegen und die anderen Local, unteranderem in unterordnern :D aber danke :P
    Viele Frauen kamen, viele sind gegangen, eine ist geblieben 12.5.12 <3 ich liebe dich Schatz :love: :love: