Download von Startpoint fortsetzen

  • VB.NET

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

    Download von Startpoint fortsetzen

    Hallo Zusammen,

    vorab, als Ausgangspunkt verwende ich aktuell folgendes Snippet:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Data
    3. Imports System.Threading
    4. Public Class MyDownload
    5. Public Event DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    6. Public Event DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
    7. Private WithEvents _Downloader As WebClient
    8. Private _Thread As Thread ' Download-Thread
    9. Public ReadOnly _Index As Integer ' Index für Multi-Download
    10. Private _FileName As String ' Save As ...
    11. Private _Uri As Uri ' Source
    12. Public Sub New(index As Integer)
    13. _Downloader = New WebClient
    14. _Index = index
    15. _Thread = Nothing
    16. End Sub
    17. Public Sub DownloadFileAsync(ByVal url As Uri, ByVal FileName As String)
    18. _FileName = FileName
    19. _Uri = url
    20. ' jedes Mal ein neuer Thread
    21. If _Thread Is Nothing OrElse Not _Thread.IsAlive Then
    22. _Thread = New Thread(AddressOf StartThread)
    23. End If
    24. _Thread.Start()
    25. End Sub
    26. Private Sub StartThread()
    27. _Downloader.DownloadFileAsync(Me._Uri, Me._FileName)
    28. End Sub
    29. Public Sub CancelAsync()
    30. _Downloader.CancelAsync()
    31. End Sub
    32. Private Sub downloader_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles _Downloader.DownloadProgressChanged
    33. RaiseEvent DownloadProgressChanged(Me, e)
    34. End Sub
    35. Private Sub downloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles _Downloader.DownloadFileCompleted
    36. Dim fi As New System.IO.FileInfo(_FileName)
    37. If (fi.Length = 0) Then
    38. fi.Delete()
    39. End If
    40. RaiseEvent DownloadFileCompleted(Me, e)
    41. End Sub
    42. End Class

    von RodFromGermany aus diesem Thread, [VB 2010] Multi-Download nur im Doppelpack.


    Ist es bei dem _Downloader As WebClient auch möglich eine Art "Startpoint" festzulegen?

    Sprich, wenn wir eine Datei downloaden, den Download abbrechen und das Programm neu starten, die aktuelle Dateilänge der vorhandenen Datei ermitteln, sowie dann von dieser Dateilänge aus, den Download fortzusetzen? (Bezogen auf eine einzelne Datei, nicht mehrere)

    Gruß, FireEmerald

    ps.: wenn möglich nach Internet- und Netzwerkprogrammierung verschieben... wollte das Thema eigentlich dort erstellen.

    FireEmerald schrieb:

    eine Art "Startpoint" festzulegen?
    Frag mal Frau Google nach .net download splitten.
    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!

    RodFromGermany schrieb:

    FireEmerald schrieb:

    eine Art "Startpoint" festzulegen?
    Frag mal Frau Google nach .net download splitten.

    Hast du mal selbst nach genau diesem Begriff gegoogelt? Dort findest du "Splitting" Tools - aber nicht ansatzweise etwas wo mit meiner Frage/Problem zusammenhängt.

    Unter "Splitten" verstehen die meisten das teilen von Strings o.ä. deshalb findet man unter diesem Begriff nichts.

    FireEmerald schrieb:

    Hast du mal selbst nach genau diesem Begriff gegoogelt?
    Ja. Höre ich da einen Vorwurf heraus? :D
    Du müsstest das hier einbringen und sagen, dass da nur Tools, nicht aber Snippets rausfallen.
    Aber
    So kannst Du Deine Suche beginnen.
    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!

    RodFromGermany schrieb:

    FireEmerald schrieb:

    Hast du mal selbst nach genau diesem Begriff gegoogelt?
    Ja. Höre ich da einen Vorwurf heraus? :D

    Definitiv: Ja. :D

    RodFromGermany schrieb:

    Du müsstest das hier einbringen und sagen, dass da nur Tools, nicht aber Snippets rausfallen.
    Aber
    So kannst Du Deine Suche beginnen.

    Es ist nicht so als hätte ich noch nicht danach gegoogelt.

    Das kleine Problem ist, es findet sich zu diesem Thema:
    1. Nichts.
    2. Visual Basic 2005, nicht mehr zu gebrauchender Code.
    3. Visual Basic 2008, nicht mehr zu gebrauchender Code.
    4. Sehr vereinzelte Ansätze in VB2010 von anderen Usern, siehe hier, welche leider nie verwendbar sind oder keinen wirklichen Ansatz erkennen lassen.

    es findet sich einfach kein Thema, welches auf VB2010 aufwärts basiert, welches von einem Autor mit Verständnis dieser Materie geschrieben wurde, von welchem man sagen könnte, ok das ist ein guter Ansatz/Vorlage. Aus diesem Grund wollte ich auch von deinem aus beginnen... :rolleyes:

    Edit:
    In diesem Thema, [VB 2012] Zugriff auf Datei nach FileStream.Close verweigert scheint SpaceyX sich das ganze schonmal genauer angeschaut zu haben.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FileDownloader
    2. Public Property FileUri As Uri
    3. Private _totalReceived As Long
    4. Private _response As Net.HttpWebResponse = Nothing
    5. Private _interrupted As Boolean = False
    6. Private _fileStream As IO.FileStream = Nothing
    7. Private _asyncOp As System.ComponentModel.AsyncOperation
    8. Private _responseStream As IO.Stream = Nothing
    9. Private _fileName As String = ""
    10. Private _canceled As Boolean = False
    11. Public Event DownloadProgressChanged(ByVal sender As FileDownloader, ByVal percentage As Integer)
    12. Public Event DownloadCompleted(ByVal sender As FileDownloader, ByVal file As IO.FileInfo)
    13. Public Event DownloadInterrupted(ByVal sender As FileDownloader)
    14. Public Sub New(ByVal uri As Uri)
    15. _response = GetResponse(uri)
    16. If IsNothing(_response) Then
    17. Throw New FileNotExistsException()
    18. End If
    19. Me.FileUri = uri
    20. _responseStream = _response.GetResponseStream()
    21. _asyncOp = System.ComponentModel.AsyncOperationManager.CreateOperation(Nothing)
    22. _fileName = _response.ResponseUri.AbsolutePath.Replace("/", "")
    23. End Sub
    24. Private Sub DoDownload()
    25. Dim buffer(1000000) As Byte
    26. Dim recLen As Integer = 0
    27. Dim progress As Integer = 0
    28. If IsNothing(_responseStream) Then
    29. _response = GetResponse(Me.FileUri)
    30. _responseStream = _response.GetResponseStream()
    31. End If
    32. If IsNothing(_fileStream) Then
    33. _fileStream = New IO.FileStream("tmp.file", IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)
    34. Else
    35. _fileStream = New IO.FileStream("tmp.file", IO.FileMode.Append, IO.FileAccess.Write)
    36. End If
    37. Do
    38. If _interrupted Then
    39. _fileStream.Close()
    40. _asyncOp.Post(New Threading.SendOrPostCallback(AddressOf OnDownloadInterrupted), Nothing)
    41. Exit Do
    42. End If
    43. If _canceled Then
    44. _fileStream.Close()
    45. _responseStream.Close()
    46. _response = Nothing
    47. _responseStream = Nothing
    48. _fileStream = Nothing
    49. _totalReceived = 0
    50. End If
    51. recLen = _responseStream.Read(buffer, 0, buffer.Length)
    52. _totalReceived += recLen
    53. progress = Convert.ToInt32((_totalReceived * 100) / _response.ContentLength)
    54. _asyncOp.Post(New Threading.SendOrPostCallback(AddressOf OnProgressChanged), DirectCast(progress, Object))
    55. If recLen = 0 Then
    56. _responseStream.Close()
    57. _fileStream.Close()
    58. _responseStream.Close()
    59. _fileStream = Nothing
    60. _response = Nothing
    61. _responseStream = Nothing
    62. _totalReceived = 0
    63. IO.File.Move("tmp.file", _fileName)
    64. _asyncOp.Post(New Threading.SendOrPostCallback(AddressOf OnDownloadComplete), DirectCast(New IO.FileInfo(_fileName), Object))
    65. Exit Do
    66. End If
    67. _fileStream.Write(buffer, 0, recLen)
    68. Loop
    69. End Sub
    70. Public Sub BeginDownload()
    71. If _interrupted Then
    72. Exit Sub
    73. End If
    74. If _canceled Then
    75. _canceled = False
    76. End If
    77. Dim a As Action = AddressOf DoDownload
    78. a.BeginInvoke(Nothing, Nothing)
    79. End Sub
    80. Public Sub InterruptDownload()
    81. _interrupted = True
    82. End Sub
    83. Public Sub CancelDownload()
    84. _canceled = True
    85. End Sub
    86. Public Sub ResumeDownload()
    87. _interrupted = False
    88. Dim a As Action = AddressOf DoDownload
    89. a.BeginInvoke(Nothing, Nothing)
    90. End Sub
    91. Private Function GetResponse(ByVal uri As Uri) As Net.HttpWebResponse
    92. Dim hReq As Net.HttpWebRequest = Nothing
    93. Dim hRes As Net.HttpWebResponse = Nothing
    94. hReq = DirectCast(Net.HttpWebRequest.Create(uri), Net.HttpWebRequest)
    95. hReq.Proxy = Nothing
    96. Try
    97. hRes = DirectCast(hReq.GetResponse(), Net.HttpWebResponse)
    98. If Not hRes.StatusCode = Net.HttpStatusCode.OK Then
    99. Return Nothing
    100. End If
    101. Catch ex As Exception
    102. Return Nothing
    103. End Try
    104. Return hRes
    105. End Function
    106. Private Sub OnDownloadComplete(ByVal o As Object)
    107. Dim fi As IO.FileInfo = DirectCast(o, IO.FileInfo)
    108. RaiseEvent DownloadCompleted(Me, fi)
    109. End Sub
    110. Private Sub OnDownloadInterrupted(ByVal o As Object)
    111. RaiseEvent DownloadInterrupted(Me)
    112. End Sub
    113. Private Sub OnProgressChanged(ByVal o As Object)
    114. Dim progress As Integer = DirectCast(o, Integer)
    115. RaiseEvent DownloadProgressChanged(Me, progress)
    116. End Sub
    117. End Class
    118. Public Class FileNotExistsException : Inherits Exception
    119. Public Sub New()
    120. MyBase.New("This file does not exist")
    121. End Sub
    122. End Class

    Er meinte aber selbst,

    SpaceyX schrieb:

    Habs nicht wirklich durchgetestet und wahrscheinlich ziemlich fehlerbehaftet.

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

    FireEmerald schrieb:

    von deinem aus beginnen...
    Meiner ist dafür nicht ausgelegt, ich hab mich damit auch nicht beschäftigt.
    Wie Du nun wohl gesehen hast, ist das Thema absolut nicht trivial, so dass die Trefferwahrscheinlichkeit entsprechend klein ist.

    FireEmerald schrieb:

    Definitiv: Ja. :D
    Und ich hab keine Lust, Deine Hausaufgaben zu machen. :D
    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!