Hi Community,
Ich hab hier einen Code geschrieben, der mir das Downloaden von Dateien in Segmenten ermöglicht.
Das Problem: beim erstellen des 2. Segments passiert gar nichts.
Ich keinen Plan woran das liegen kann. Das Programm läuft ja. Es wartet nur auf eine Antwort vom Server, die es anscheinend nicht bekommt.
Hoffe ihr könnt mir helfen und danke schon mal im vorraus.
P.S: Wenn der Code dann endlich läuft verpack ich den Code in eine Klasse, die den Code asynchron aufruft und stelle es hier ins Forum.
Hier mein Code:
Ich hab hier einen Code geschrieben, der mir das Downloaden von Dateien in Segmenten ermöglicht.
Das Problem: beim erstellen des 2. Segments passiert gar nichts.
Ich keinen Plan woran das liegen kann. Das Programm läuft ja. Es wartet nur auf eine Antwort vom Server, die es anscheinend nicht bekommt.
Hoffe ihr könnt mir helfen und danke schon mal im vorraus.
P.S: Wenn der Code dann endlich läuft verpack ich den Code in eine Klasse, die den Code asynchron aufruft und stelle es hier ins Forum.
Hier mein Code:
VB.NET-Quellcode
- Imports System.Net
- Imports System.IO
- Module SegmentDownlaod
- Const BufferSize As Integer = 65536
- Sub Main(ByVal args() As String)
- If args.Length <> 3 Then
- Console.WriteLine("Ungültige Anzahl der Argumente!")
- Console.ReadLine()
- Exit Sub
- End If
- 'Einstellungen speichern
- Dim DownloadPath As String = args(0)
- Dim SavePath As String = args(1)
- Dim SegmentCount As Integer = CInt(args(2))
- 'Einstellungen anzeigen
- Console.WriteLine("Speichere " & DownloadPath & " unter " & SavePath & " in " & SegmentCount & " Segmenten.")
- Console.WriteLine()
- 'Downloadgröße abrufen und anzeigen
- Dim DownloadLength As Long = GetDownloadLength(DownloadPath)
- Console.WriteLine("Downloadgröße: " & DownloadLength & "Bytes")
- Console.WriteLine()
- 'Liste zum speichern der Segmente
- Dim Segment(SegmentCount - 1) As BinaryReader
- Dim SegmentLength(SegmentCount - 1) As Long
- Dim SegmenthRecieve(SegmentCount - 1) As Long
- Dim SegmentCompleted(SegmentCount - 1) As Boolean
- Dim CompletedSegments As Integer = 0
- 'Segmente erstellen
- For i% = 1 To SegmentCount
- 'Segmentschnitt bestimmen
- Dim StartS As Integer = CInt((i - 1) * (DownloadLength / SegmentCount))
- Dim EndS As Integer = CInt(i * (DownloadLength / SegmentCount))
- If i < SegmentCount Then EndS -= 1
- Console.WriteLine("Segment " & i & " von " & StartS & " bis " & EndS)
- 'Segment erstellen
- 'Download anfordern
- Dim Request As HttpWebRequest = CType(HttpWebRequest.Create(DownloadPath), HttpWebRequest)
- Request.AddRange(StartS, EndS)
- Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
- 'Download in Liste ablegen
- Segment(i - 1) = New BinaryReader(Response.GetResponseStream())
- Console.WriteLine("Segment " & i & " ertsellt!")
- Console.WriteLine()
- Next
- 'Datei erstellen
- Dim FileStream As New FileStream(SavePath, FileMode.Create)
- FileStream.SetLength(DownloadLength)
- Dim Writer As New BinaryWriter(FileStream)
- 'Segmente zusammenführen und speichern
- Do
- 'Jedes Segment einzeln bearbeiten
- For i% = 0 To SegmentCount - 1
- 'Überprüfen, ob segment fertig
- If Not SegmentCompleted(i) Then
- 'Position festlegen
- Dim Length As Long
- For n% = 0 To i - 1
- Length += SegmentLength(n)
- Next
- Length += SegmenthRecieve(i)
- 'positionieren
- Writer.Seek(CInt(Length), SeekOrigin.Begin)
- 'Segment in Datei schreiben
- Dim Count As Integer = 0
- Dim Buffer(BufferSize - 1) As Byte
- Count = Segment(i).Read(Buffer, 0, BufferSize)
- Writer.Write(Buffer, 0, Count)
- 'Informationen aktualisieren und ausgeben
- SegmenthRecieve(i) += Count
- Console.WriteLine("Segment {0}: {1]Bytes von {2}Bytes : {3}%", i, SegmenthRecieve(i), SegmentLength(i), SegmenthRecieve(i) / SegmentLength(i))
- 'Überprüfen, ob Segment fertig ist
- If SegmenthRecieve(i) = SegmentLength(i) Then
- SegmentCompleted(i) = True
- CompletedSegments+= 1
- Console.WriteLine("Segment " & i & " fertig!")
- End If
- End If
- Next
- Loop Until CompletedSegments = SegmentsCount
- Console.WriteLine("Download fertig!")
- Console.ReadLine()
- End Sub
- Private Function GetDownloadLength(ByVal uri As String) As Long
- Dim Request As HttpWebRequest = CType(HttpWebRequest.Create(uri), HttpWebRequest)
- Request.Method = "HEAD"
- Return Request.GetResponse.ContentLength
- End Function
- End Module