• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 660
  • Last Modified:

Need help on HttpWebRequest ,HttpWebResponse coding urgent..... Cannot loop to download multiple files

Hi  all,

Please help. I cannot download the files in loop. !st loop work perfect. Second loop the process die at
length = theResponse.ContentLength . Plese help me correct my code. I check already, the loop no problem.
Public Sub ChangeTexts(ByVal length As Long, ByVal position As Integer, ByVal percent As Integer, ByVal speed As Double)
        Me.lblFileSize.Text = "File Size: " & Math.Round((length / 1024), 2) & " KB"
        Me.lblFileName.Text = "Downloading: " & filename
        Me.lblStatus.Text = "Downloaded " & Math.Round((position / 1024), 2) & " KB of " & Math.Round((length / 1024), 2) & "KB (" & Me.ProgressBar.Value & "%)"
        If speed = -1 Then
            Me.lblSpeed.Text = "Speed: calculating..."
            Me.lblSpeed.Text = "Speed: " & Math.Round((speed / 1024), 2) & " KB/s"
        End If
        Me.ProgressBar.Value = percent
    End Sub
    Private Sub backgroundwork()
        Dim ServerPath As String
        Dim strTargetPath As String
        Dim strDestinationPath As String
        strDestinationPath = Application.StartupPath & "\flash"
        ServerPath = "http://cckoay/file_manager_web/flash/merchant/"
        strTargetPath = ServerPath & strMerchant
        Dim countUpdatedFiles As Integer
        Dim j As Integer
        countUpdatedFiles = ds.Tables(0).Rows.Count
        If countUpdatedFiles > 0 Then
            countUpdatedFiles = countUpdatedFiles - 1
            'Creating the request and getting the response
            Dim theResponse As HttpWebResponse
            Dim theRequest As HttpWebRequest
            Dim err As String
            For j = 0 To countUpdatedFiles
                Dim length As Long
                filename = strTargetPath & "/" & ds.Tables(0).Rows(j)(0)
                whereToSave = strDestinationPath & "\" & ds.Tables(0).Rows(j)(0)
                Try 'Checks if the file exist
                    theRequest = WebRequest.Create(filename)
                    theResponse = theRequest.GetResponse
                    length = theResponse.ContentLength 'Size of the response (in bytes)
                Catch ex As Exception
                    MessageBox.Show("An error occurred while downloading file. Possibe causes:" & ControlChars.CrLf & _
                                    "1) File doesn't exist" & ControlChars.CrLf & _
                                    "2) Remote server error", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)
                    Me.Invoke(cancelDelegate, True)
                    err = ex.ToString()
                    Exit Sub
                End Try
                Dim safedelegate As New ChangeTextsSafe(AddressOf ChangeTexts)
                Me.Invoke(safedelegate, length, 0, 0, 0) 'Invoke the TreadsafeDelegate
                Dim writeStream As New IO.FileStream(Me.whereToSave, IO.FileMode.Create)
                'Replacement for Stream.Position (webResponse stream doesn't support seek)
                Dim nRead As Integer
                nRead = 0
                'To calculate the download speed
                Dim speedtimer As New Stopwatch
                Dim currentspeed As Double = -1
                Dim readings As Integer = 0
                    If BackgroundWorker1.CancellationPending Then 'If user abort download
                        Exit Do
                    End If
                    Dim readBytes(4095) As Byte
                    Dim bytesread As Integer = theResponse.GetResponseStream.Read(readBytes, 0, 4096)
                    nRead += bytesread
                    Dim percent As Short = (nRead * 100) / length
                    Me.Invoke(safedelegate, length, nRead, percent, currentspeed)
                    If bytesread = 0 Then Exit Do
                    writeStream.Write(readBytes, 0, bytesread)
                    readings += 1
                    If readings >= 5 Then 'For increase precision, the speed it's calculated only every five cicles
                        currentspeed = 20480 / (speedtimer.ElapsedMilliseconds / 1000)
                        readings = 0
                    End If
                    'Close the streams
            Next j
            Dim completeDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)
            Me.Invoke(completeDelegate, False)
        End If
        If Me.BackgroundWorker1.CancellationPending Then
            Dim cancelDelegate As New DownloadCompleteSafe(AddressOf DownloadComplete)
            Me.Invoke(cancelDelegate, True)
            Exit Sub
        End If
    End Sub

Open in new window

  • 2
  • 2
1 Solution
Try opening and closing the response object for every file. Look at the following;
togo413Author Commented:
You are my lucky star. I solve this nearly 2 nite d.
Thanks hielo.

I got close theResponse.GetResponseStream.Close() after every loop.
But din theResponse.Close

After add in, it works perfect.
Nice to hear it worked for you.
Where are you?
togo413Author Commented:
Me  haha office lo. Me from Malaysia, now in Kuala Lumpur office. now is midnite 4:40 am
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now