DownloadFileCompleted funktioniert nicht mehr

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Cell.

    DownloadFileCompleted funktioniert nicht mehr

    Hallo zusammen

    Ich habe mich hier im Forum schon ein klein wenig umgesehen und auch die Boardsuche verwendet aber irgendwie kann ich nichts finden, dass mir bei meinem Problem helfen kann.

    Folgendes Problem:

    Ich lade von meinem Server eine Datei mit dem WebClient herunter.
    Soweit so Gut
    Ich kann die Datei anschließend aber nicht öffnen, da ich dann eine IOException bekomme. (Die Datei wird von einem anderen Prozess verwendet)
    Da kommt eigentlich nur der Downloadprozess in Frage. Der aber durfte nicht mehr auf die Datei zugreifen, da ich meinen StreamReader in dem DownloadFileCompleted Event benutze

    ich hoffe ihr habt eine Idee

    mfg Cell
    klar hier mein code:



    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Net
    4. Imports System.Text
    5. Public Class Form1
    6. Public WithEvents wc As New WebClient
    7. Dim schritt As String = "Prüfung"
    8. Public clientversion As Integer
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. wc.DownloadFileAsync(New Uri("http://www.meinserver.de/update.dat"), Application.StartupPath & "\update.dat")
    11. End Sub
    12. Private Sub wc_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.DownloadFileCompleted
    13. If schritt = "Prüfung" Then
    14. 'Serverversion auslesen Anfang
    15. Dim serverversion As Integer
    16. Dim sr As StreamReader = New StreamReader(Application.StartupPath & "\update.dat")
    17. serverversion = Convert.ToInt32(sr.ReadLine)
    18. sr.Close()
    19. 'Serverversion auslesen Ende
    20. 'Clientversion auslesen Anfang
    21. Try
    22. Dim sr2 As StreamReader = New StreamReader(Application.StartupPath & "\vers.dat")
    23. clientversion = Convert.ToInt32(sr2.ReadLine)
    24. sr.Close()
    25. Catch
    26. clientversion = 1
    27. End Try
    28. 'Clientversion auslesen Ende
    29. 'Prüfen ob Server neuer ist als Client Anfang
    30. If serverversion > clientversion Then
    31. schritt = "Listeladen"
    32. File.Delete(Application.StartupPath & "\update.dat")
    33. wc.DownloadFileAsync(New Uri("http://www.meinserver.de/serverliste.dat"), Application.StartupPath & "\serverliste.dat")
    34. Else
    35. File.Delete(Application.StartupPath & "\update.datl")
    36. Shell(Application.StartupPath & "\progie.exe")
    37. End If
    38. 'Prüfen ob Server neuer ist als Client Ende
    39. End If
    40. If schritt = "Listeladen" Then
    41. serverliste()
    42. End If
    43. End Sub
    44. Public Sub serverliste()
    45. Dim sline As String
    46. Dim sr As StreamReader = New StreamReader(Application.StartupPath & "\serverliste.dat")
    47. Do
    48. sline = sr.ReadLine
    49. lb_namen.Items.Add(sline)
    50. Loop Until sr.ReadToEnd
    51. End Sub
    52. Private Sub wc_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles wc.DownloadProgressChanged
    53. ProgressBar1.Value = e.ProgressPercentage
    54. End Sub
    55. End Class




    wenn Ich das Programm Starte, arbeitet er es ab bis zur Sub serverliste und gibt mir dann die Exception
    die Frage war auch nicht wie ich einen Dateidownload noch durchführen kann, sondern die Frage ist noch immer... Warum ich auf die heruntergeladene Datei nicht zugreifen kann, wenn der Webclient schon das DownloadFileCompleted Event ausgelöst hast.

    Der Dateidownload ansich Funktioniert auch in meinem Beispiel
    Richtig

    Das ist ja das irrwitzige dabei. Beim ersten mal führt er den Schritt problemlos aus. Sprich die Serververion kann ich problemlos auslesen. Wenn ich allerdings die Serverliste übermitteln will gibts probleme. Dann kommt die Exception.

    Ich habe aber mit dem gleichen Code schon grössere Dateien heruntergeladen und hatte nie Probleme. Ich verstehe nicht warum das jetzt grade mit dem Projekt solche Spacken macht

    Nur zum besseren Verständniss. Der Fehler tritt in Zeile 62 auf
    Einfache Erklärung:

    Bei DownloadFileAsync wird die Datei heruntergeladen und der Code läuft nebenbei weiter.
    Bei DownloadFile läuft der Code erst dann weiter wenn die Datei vollständig heruntergeladen wurde.


    Es kann also dazu komme das der STreamreader instaziiert wird aber die Datei noch nicht vorhanden ist.

    Cell schrieb:

    Das ist ja alles gut und schön aber sollte nicht trotzdem das DownloadfileCompleted Event ausgelöst werden wenn die Datei Wirklich komplett heruntergeladen wurde.... Naja manchmal offensichtlich nicht... Wieder was gelernt


    Vorher gibt's aber die Exception dann kommt es nimmer dazu :P
    Du machst es einwenig umständlich.
    Du kannst das Event einfach weglassen und es direkt als String konvertieren.

    wc.DownloadFileAsync(New Uri("http://www.meinserver.de/update.dat"), Application.StartupPath & "\update.dat")
    Diese ganzen Schritte überspringen.

    Dim Clientversion As String = wc.DownloadString(New Uri("http://www.meinserver.de/update.dat"), Application.StartupPath & "\update.dat")

    Wie du weiter hantieren kannst, wirst du wahrscheinlich selber wissen.


    Das Event wird immer gefeuert. Lass mal den gesamten Clusterfuck im Event weg und mach nur MessageBox.Show("DownloadFileCompleted") draus.

    Richtig das ist mir schon klar aber es wird zu früh gefeuert. Nämlich schon dann, wenn die Datei noch gar nicht vollständig heruntergeladen wurde. Bzw bevor der zugriff auf die Datei möglich ist.

    Zitat von »Cell«


    Das ist ja alles gut und schön aber sollte nicht trotzdem das DownloadfileCompleted Event ausgelöst werden wenn die Datei Wirklich komplett heruntergeladen wurde.... Naja manchmal offensichtlich nicht... Wieder was gelernt

    Vorher gibt's aber die Exception dann kommt es nimmer dazu :P


    Das kann nicht sein. Wie Samus Aran schon richtig gesagt hat wird das Event in jedem Fall gefeuert. Solange ich in dem Event nicht auf die heruntergeladene Datei zugreifen muss, gibts auch keine Exception. Also kann sie auch nicht schon vorher auftreten.

    Das "Problem" dass ich hatte, ist das das Event ausgelöst hatte, bevor der Zugriff auf die Datei möglich war.





    Du machst es einwenig umständlich.
    Du kannst das Event einfach weglassen und es direkt als String konvertieren.

    wc.DownloadFileAsync(New Uri("http://www.meinserver.de/update.dat"), Application.StartupPath & "\update.dat")
    Diese ganzen Schritte überspringen.

    Dim Clientversion As String = wc.DownloadString(New Uri("http://www.meinserver.de/update.dat"), Application.StartupPath & "\update.dat")

    Wie du weiter hantieren kannst, wirst du wahrscheinlich selber wissen.

    Das ist natürlich richtig. So werde ich es in Zukunft auch machen. Wenn ich dergleichen wieder Programmieren muss.