Solved

vb.net FTP Download / File Size

Posted on 2007-12-06
3
15,432 Views
Last Modified: 2013-12-16
I have aprogram which connects to the FTP server I have the upload peice working I can get he file directory yada yada where the problem lies is
1 - Cant get it to download the code completely(ill attach my download code and the error)
2 - I need to figure out how toget the file size befor I download so I can implement my progress bar and you will see where I have tried "response.contentlength" but it returns "-1"
------------
Problem for #1 is listed underneath the code
-------------------

Thanks for any help!
Private Sub btnDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDownload.Click

        fdb.SelectedPath = Application.StartupPath

        fdb.ShowDialog()

        Dim tempSaveDir = fdb.SelectedPath

        Try

            Dim outputStream As FileStream = New FileStream(fdb.SelectedPath + "\\" + lbFiles.SelectedItem, FileMode.OpenOrCreate)

            Dim clsRequest As System.Net.FtpWebRequest = DirectCast(System.Net.WebRequest.Create(tempurl & "/" & lbFiles.SelectedItem), System.Net.FtpWebRequest)

            clsRequest.Credentials = New System.Net.NetworkCredential(Form1.tbUser.Text, Form1.tbPass.Text)

            clsRequest.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
 

            Dim response As FtpWebResponse = clsRequest.GetResponse

            Dim ftpStream As Stream = response.GetResponseStream()

            Dim cl As String = response.ContentLength

            MsgBox(cl)

            Dim bufferSize As Integer = 1024

            Dim readCount As Integer

            Dim buffer(bufferSize) As Byte

            Dim tempCount = 0

            ProgressBar.Value = 0

            While True

                readCount = ftpStream.Read(buffer, 0, bufferSize)

                If readCount > 0 Then

                    outputStream.Write(buffer, 0, readCount)

                    'ProgressBar.Value = (tempCount / cl) * 100

                End If

                'MsgBox(outputstre)

            End While
 

            ftpStream.Flush()

            outputStream.Flush()

            ftpStream.Dispose()

            outputStream.Dispose()

            response.Close()
 

        Catch ui As UriFormatException

            MsgBox("ui " + ui.Message)

        Catch io As IOException

            MsgBox("IO " + io.Message)

        Catch ex As Exception

            MsgBox("EX " + ex.Message)

        End Try

    End Sub
 
 

ERROR I receive when trying to download I get about 75% of the way thru the download - 

EX Cannot access adisposed object.

Object name: 'system.net.sockets.networkstream'.
 

Then it just stops and aborts the download all this doesnt make sense because im not disposing any object untill after the read AND I commented the code out and still doenst work.

Open in new window

0
Comment
Question by:aumudin
3 Comments
 
LVL 19

Accepted Solution

by:
Rimvis earned 300 total points
Comment Utility
You have an endless loop. Maybe this is the reason? It never stops, even after download is finished

Take a look at this code:

...

            clsRequest.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
 

            Dim cl As String

            Dim response As FtpWebResponse = clsRequest.GetResponse
 

            If response.ContentLength > 0 Then

                cl = response.ContentLength

            Else

                'Get filesize from status message

                Dim r As Regex = New Regex("(?<size>\d+[ ]bytes)")

                Dim m As Match = r.Matches(response.StatusDescription)("size")

                cl = m.Value

            End If
 

            Dim ftpStream As Stream = response.GetResponseStream()

            Dim bufferSize As Integer = 1024

            Dim readCount As Integer

            Dim buffer(bufferSize) As Byte

            Dim tempCount = 0

            ProgressBar.Value = 0

            While True

                readCount = ftpStream.Read(buffer, 0, bufferSize)                

                If readCount > 0 Then

                    outputStream.Write(buffer, 0, readCount)

                    tempCount += readCount

                    ProgressBar.Value = (tempCount / cl) * 100

                    ProgressBar.Refresh()

                Else

                    'Exit loop

                    Exit While

                End If

                'MsgBox(outputstre)

            End While

...

Open in new window

0
 
LVL 16

Assisted Solution

by:gnoon
gnoon earned 200 total points
Comment Utility
This's from MSDN

"
ContentLength returns 1 if no data was returned in the response or if the server did not send content length information. The return value is greater than or equal to zero if data was or should have been returned
"

Print the URL to the console, then copy/paste at a browser. Hits Enter and see if any file is downloaded.

Console.WriteLine(tempurl & "/" & lbFiles.SelectedItem)

Output?

P.S. I noticed that you're facing infinite loop of reading (no such line of break), and I think it's the cause of error. Try change it to this
While True

	readCount = ftpStream.Read(buffer, 0, bufferSize)

	If readCount > 0 Then

		outputStream.Write(buffer, 0, readCount)

		'ProgressBar.Value = (tempCount / cl) * 100

	Else

		Exit While

	End If

End While

Open in new window

0
 
LVL 4

Author Comment

by:aumudin
Comment Utility
Alright and as far as getting the file size I found the answer its ftpwebresponse.getFileSize pretty simple lol as far as the infinite loop I cant belive I didnt see that...... Thanks guys
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

This article describes relatively difficult and non-obvious issues that are likely to arise when creating COM class in Visual Studio and deploying it by professional MSI-authoring tools. It is assumed that the reader is already familiar with the cla…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now