Guten Abend,
ich habe ein Programm geschrieben was eine Winrar Datei von einem Webserver runterladen soll. Dieses Programm zeigt den Fortschritt des Downloads in Form einer Progressbar, Downloadgeschwindigkeit und die verbleibende Größe des Downloads (z.B. 4354/100756kb).
Mein Quellcode:
Das Problem welches ich habe ist, das mein Programm keine Dateien über 1GB Größe downloadet. Sobald die Datei größer ist als 1GB downloadet er die Datei nicht mehr (Geschwindigkeit bleibt ausgeblendet, Fortschrittbalken bleibt leer, usw.). Meine Datei die ich aber zum Download anbieten möchte ist eine 15GB große Winrar Datei.
Hab ich vielleicht irgendetwas übersehen?
ich habe ein Programm geschrieben was eine Winrar Datei von einem Webserver runterladen soll. Dieses Programm zeigt den Fortschritt des Downloads in Form einer Progressbar, Downloadgeschwindigkeit und die verbleibende Größe des Downloads (z.B. 4354/100756kb).
Mein Quellcode:
Quellcode
- Imports System.Net
- Imports System.IO
- Public Class Form2
- Dim WithEvents worker As New System.ComponentModel.BackgroundWorker
- Dim timer As Stopwatch 'Stoppuhr zur bestimmung der Downloadgeschwindigkeit
- Dim loaded As Long 'Anzahl na Bytes die in einer Zeiteinheit geladen wurden
- Dim speed As Double 'Downloadgeschwindigkeit in KB/s
- Dim url As String 'Die URL mit der zu ladenden Datei
- Dim des As String 'Zielpfad auf dem lokalen System
- Dim buffer(327680) As Byte 'Puffer für den Download -> Je größer desto schneller der Download
- Dim totBytes As Long = 0 'Größe der zu ladenden Datei
- Dim curBytes As Long = 0 'Bisher geladene Bytes
- Dim readBytes As Long 'Anzehl gelesener Bytes pro Block
- Dim bis As Stream 'Der Strom mit der zu ladenden Datei
- Dim fos As FileStream 'Strom der die Datei lokal speichert
- Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- MaximizeBox = False
- Me.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowAndShrink
- End Sub
- Public Sub doWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork
- timer = New Stopwatch
- 'Stream zur Datei im Internet erstellen und Lokal
- Dim request As HttpWebRequest = HttpWebRequest.Create(url)
- '###################
- 'Download fortsetzen falls curBytes > 0
- request.Proxy = Nothing
- request.AddRange(CInt(curBytes))
- Dim response As HttpWebResponse = request.GetResponse
- If Not response.StatusCode = HttpStatusCode.PartialContent Then
- 'falls der Server wiederaufnahme nicht unterstützt bei 0 anfangen
- curBytes = 0
- End If
- '###################
- bis = response.GetResponseStream
- If curBytes > 0 Then
- fos = New FileStream(des, FileMode.Append, FileAccess.Write)
- totBytes = response.ContentLength + curBytes
- Else
- fos = New FileStream(des, FileMode.Create, FileAccess.Write)
- totBytes = response.ContentLength
- End If
- timer.Start() 'Mit dem Timer wird gemessen, wieviele Bytes in der letzten Sekunde heruntergeladen wurden
- While (True)
- readBytes = bis.Read(buffer, 0, buffer.Length) 'Aus dem Download Stream lesen
- If readBytes = 0 Then
- MessageBox.Show("*Text das DOwnload abgeschlossen ist*", "Download erfolgreich")
- Exit While 'Download ist abgeschlossen
- End If
- fos.Write(buffer, 0, readBytes) 'Geladene Bytes lokal Speichern
- curBytes += readBytes 'Anzahl gesammt gelesener Bytes erhöhen
- loaded += readBytes 'Anzahl der Bytes erhöhen die in der Letzten Sekunde geladen wurden
- If timer.ElapsedMilliseconds >= 1000 Then 'Wenn eine Sekunde vergangen ist
- speed = 0
- speed = FormatNumber(loaded / 1024, 2) 'Geschwindigkeit berechnen
- loaded = 0 'und zähler zurücksetzen
- timer.Reset() 'den Timer neustarten
- timer.Start()
- End If
- 'Die Anzeige im Formular-Thread aktualisieren
- Label1.Invoke(New refreshGUIDel(AddressOf refreshGUI), New Object() {})
- End While
- 'Ressourcen Freigeben
- timer.Stop()
- fos.Close()
- bis.Close()
- End Sub
- Private Sub workerDisposing(ByVal sender As Object, ByVal e As System.EventArgs) Handles worker.Disposed
- 'Die Streams schließen, da sonst die temporäre Datei nicht gelöscht werden kann!
- fos.Close()
- bis.Close()
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim antwort As String
- Dim webseite As String = "*Url zum File*"
- antwort = MessageBox.Show("*Einleitungstext*", "*Überschrift*", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
- If antwort = 6 Then
- url = webseite
- Button1.Enabled = False
- Dim fsd As New SaveFileDialog
- fsd.FileName = "*Dateiname*"
- des = fsd.FileName
- '################
- If IO.File.Exists(fsd.FileName) Then
- 'Wenn datei exestiert fragen ob diese zum Fortsetzen gewählt werden soll
- Dim f As String = MessageBox.Show("*Text*", "*Download forsetzen*", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
- If f = vbYes Then
- 'gelesene Bytes aktualisisren um dort den download zu starten
- curBytes = IO.File.ReadAllBytes(fsd.FileName).Length
- totBytes = curBytes
- End If
- End If
- '################
- worker.WorkerSupportsCancellation = True
- worker.RunWorkerAsync()
- Else
- End If
- End Sub
- Private Delegate Function refreshGUIDel()
- Private Function refreshGUI()
- 'Die Fortschrittsanzeige aktualisieren
- Me.ProgressBar1.Maximum = totBytes
- Me.ProgressBar1.Value = curBytes
- Me.Label1.Text = FormatNumber(curBytes / 1024, 0) & "KB / " & FormatNumber(totBytes / 1024, 0) & "KB" & vbNewLine & "Geschwindigkeit: " & speed & " KB/s"
- Return Nothing
- End Function
- Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- 'Wenn das Formular geschlossen wird während der Download noch läuft, diesen erst beenden und Ressourcen freigeben
- If worker.IsBusy Then
- worker.CancelAsync()
- worker.Dispose()
- '###############
- 'Fragen ob Temoporäre Datei gelöscht werden soll
- If MessageBox.Show("*Text*", "*Text*", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.No Then
- File.Delete(des)
- End If
- '###############
- End If
- End Sub
- End Class
Das Problem welches ich habe ist, das mein Programm keine Dateien über 1GB Größe downloadet. Sobald die Datei größer ist als 1GB downloadet er die Datei nicht mehr (Geschwindigkeit bleibt ausgeblendet, Fortschrittbalken bleibt leer, usw.). Meine Datei die ich aber zum Download anbieten möchte ist eine 15GB große Winrar Datei.
Hab ich vielleicht irgendetwas übersehen?