Vb.net System.Net.FTPClient-如何正确传输文件

Vb.net System.Net.FTPClient-如何正确传输文件,vb.net,Vb.net,我正试图使用System.Net.FtpClient从FTP服务器下载一些文本文件。对于如何处理流并将其写入文件,我有点困惑 Using ftp = New FtpClient() ftp.Host = "ip" ftp.Credentials = New NetworkCredential("user", "passw") ftp.SetWorkingDirectory("/pathToFolder/") For Each it

我正试图使用
System.Net.FtpClient
从FTP服务器下载一些文本文件。对于如何处理流并将其写入文件,我有点困惑

Using ftp = New FtpClient()

        ftp.Host = "ip"
        ftp.Credentials = New NetworkCredential("user", "passw")
        ftp.SetWorkingDirectory("/pathToFolder/")
        For Each item In ftp.GetListing(ftp.GetWorkingDirectory())

            Select Case item.Type
                Case FtpFileSystemObjectType.Directory
                    MessageBox.Show("Folder: " + item.FullName)
                Case FtpFileSystemObjectType.File
                    MessageBox.Show("File: " + item.FullName)


                                            Using istream As Stream = ftp.OpenRead(item.FullName)

                        ' istream.Position is incremented accordingly to the reads you perform
                        ' istream.Length == file size if the server supports getting the file size
                        ' also note that file size for the same file can vary between ASCII and Binary
                        ' modes and some servers won't even give a file size for ASCII files! It is
                        ' recommended that you stick with Binary and worry about character encodings
                        ' on your end of the connection.

                        Dim fileoutput As New FileStream("C:\Documents and Settings\jasonb\Desktop\Report1.txt", FileMode.Create, System.IO.FileAccess.Write)

                        Dim buffer As Byte() = New Byte(8 * 1024 - 1) {}
                        Dim len As Integer
                        While (len = istream.Read(buffer, 0, buffer.Length)) > 0
                            fileoutput.Write(buffer, 0, len)
                        End While


                    End Using


            End Select
        Next


    End Using
这条小溪一定有我需要的东西。我可以看到流位于位置0,长度大约为126,但是我应该如何捕获文件/内容呢?我不断得到空白文件输出

:编辑: 似乎没有输出任何内容,因为len=0。不知道这意味着什么或者我该怎么做

                        While (len = istream.Read(buffer, 0, buffer.Length)) > 0
                            fileoutput.Write(buffer, 0, len)
                        End While

与使用ftpclient相比,我使用的是FTPWebRequest对象,工作起来很有魅力,我更喜欢将下载分为2mb块。 其中targetFullUNC是文件的UNC,指向要放置下载的位置。 ftpFullURI是ftp上下载文件的完整url

 Dim FTPRequest As FtpWebRequest = FtpWebRequest.Create("ftp://" & ftpfullURI)
            With FTPRequest
                .EnableSsl = False
                .Credentials = New NetworkCredential(usn, pwd)
                .KeepAlive = False
                .UseBinary = True
                .UsePassive = True
                .Method = System.Net.WebRequestMethods.Ftp.DownloadFile
            End With

            RaiseEvent trace(Me, "FTPDownload() logging onto ftp")
            Using FTPResponse As System.Net.FtpWebResponse = CType(FTPRequest.GetResponse, System.Net.FtpWebResponse)
                Using responseStream As IO.Stream = FTPResponse.GetResponseStream
                    Using fs As New IO.FileStream(targetfullUNC, IO.FileMode.Create)
                        Dim buffer(2047) As Byte
                        Dim read As Integer = 0
                        RaiseEvent trace(Me, "downloading file " & targetfullUNC)
                        Do
                            read = responseStream.Read(buffer, 0, buffer.Length)
                            fs.Write(buffer, 0, read)
                        Loop Until read = 0
                        responseStream.Close()
                        fs.Flush()
                        fs.Close()

                    End Using
                    responseStream.Close()
                End Using
                FTPResponse.Close()
            End Using

与使用ftpclient相比,我使用的是FTPWebRequest对象,工作起来很有魅力,我更喜欢将下载分为2mb块。 其中targetFullUNC是文件的UNC,指向要放置下载的位置。 ftpFullURI是ftp上下载文件的完整url

 Dim FTPRequest As FtpWebRequest = FtpWebRequest.Create("ftp://" & ftpfullURI)
            With FTPRequest
                .EnableSsl = False
                .Credentials = New NetworkCredential(usn, pwd)
                .KeepAlive = False
                .UseBinary = True
                .UsePassive = True
                .Method = System.Net.WebRequestMethods.Ftp.DownloadFile
            End With

            RaiseEvent trace(Me, "FTPDownload() logging onto ftp")
            Using FTPResponse As System.Net.FtpWebResponse = CType(FTPRequest.GetResponse, System.Net.FtpWebResponse)
                Using responseStream As IO.Stream = FTPResponse.GetResponseStream
                    Using fs As New IO.FileStream(targetfullUNC, IO.FileMode.Create)
                        Dim buffer(2047) As Byte
                        Dim read As Integer = 0
                        RaiseEvent trace(Me, "downloading file " & targetfullUNC)
                        Do
                            read = responseStream.Read(buffer, 0, buffer.Length)
                            fs.Write(buffer, 0, read)
                        Loop Until read = 0
                        responseStream.Close()
                        fs.Flush()
                        fs.Close()

                    End Using
                    responseStream.Close()
                End Using
                FTPResponse.Close()
            End Using

与使用ftpclient相比,我使用的是FTPWebRequest对象,工作起来很有魅力,我更喜欢将下载分为2mb块。 其中targetFullUNC是文件的UNC,指向要放置下载的位置。 ftpFullURI是ftp上下载文件的完整url

 Dim FTPRequest As FtpWebRequest = FtpWebRequest.Create("ftp://" & ftpfullURI)
            With FTPRequest
                .EnableSsl = False
                .Credentials = New NetworkCredential(usn, pwd)
                .KeepAlive = False
                .UseBinary = True
                .UsePassive = True
                .Method = System.Net.WebRequestMethods.Ftp.DownloadFile
            End With

            RaiseEvent trace(Me, "FTPDownload() logging onto ftp")
            Using FTPResponse As System.Net.FtpWebResponse = CType(FTPRequest.GetResponse, System.Net.FtpWebResponse)
                Using responseStream As IO.Stream = FTPResponse.GetResponseStream
                    Using fs As New IO.FileStream(targetfullUNC, IO.FileMode.Create)
                        Dim buffer(2047) As Byte
                        Dim read As Integer = 0
                        RaiseEvent trace(Me, "downloading file " & targetfullUNC)
                        Do
                            read = responseStream.Read(buffer, 0, buffer.Length)
                            fs.Write(buffer, 0, read)
                        Loop Until read = 0
                        responseStream.Close()
                        fs.Flush()
                        fs.Close()

                    End Using
                    responseStream.Close()
                End Using
                FTPResponse.Close()
            End Using

与使用ftpclient相比,我使用的是FTPWebRequest对象,工作起来很有魅力,我更喜欢将下载分为2mb块。 其中targetFullUNC是文件的UNC,指向要放置下载的位置。 ftpFullURI是ftp上下载文件的完整url

 Dim FTPRequest As FtpWebRequest = FtpWebRequest.Create("ftp://" & ftpfullURI)
            With FTPRequest
                .EnableSsl = False
                .Credentials = New NetworkCredential(usn, pwd)
                .KeepAlive = False
                .UseBinary = True
                .UsePassive = True
                .Method = System.Net.WebRequestMethods.Ftp.DownloadFile
            End With

            RaiseEvent trace(Me, "FTPDownload() logging onto ftp")
            Using FTPResponse As System.Net.FtpWebResponse = CType(FTPRequest.GetResponse, System.Net.FtpWebResponse)
                Using responseStream As IO.Stream = FTPResponse.GetResponseStream
                    Using fs As New IO.FileStream(targetfullUNC, IO.FileMode.Create)
                        Dim buffer(2047) As Byte
                        Dim read As Integer = 0
                        RaiseEvent trace(Me, "downloading file " & targetfullUNC)
                        Do
                            read = responseStream.Read(buffer, 0, buffer.Length)
                            fs.Write(buffer, 0, read)
                        Loop Until read = 0
                        responseStream.Close()
                        fs.Flush()
                        fs.Close()

                    End Using
                    responseStream.Close()
                End Using
                FTPResponse.Close()
            End Using

它之所以创建长度为0的文件,是因为它从未将任何信息写入输出流(fileoutput变量)

正如您在评论中提到的,问题与条件相符

 While (len = istream.Read(buffer, 0, buffer.Length)) > 0
这可以在C#中工作,但在VB.NET中它没有相同的行为。我认为在VB.NET中,这一行实际做的不是将istream.Read(buffer,0,buffer.Length)的结果赋给变量len,然后比较len是否大于0。相反,它是比较len大于0,但是len将为0,所以这个条件永远不会成立

请尝试以下操作:

Dim buffer As Byte() = New Byte(8 * 1024 - 1) {}
Dim len As Integer = 0
len = istream.Read(buffer, 0, buf.Length)
While len > 0
  fileoutput.Write(buffer, 0, len)
  len = istream.Read(buffer, 0, buffer.Length)
End While
这样,当输入流读取下一个字节块时,它实际上会在文件输出流中写入一些内容


我希望它能有所帮助。

它之所以创建长度为0的文件,是因为它从未将任何信息写入输出流(fileoutput变量)

正如您在评论中提到的,问题与条件相符

 While (len = istream.Read(buffer, 0, buffer.Length)) > 0
这可以在C#中工作,但在VB.NET中它没有相同的行为。我认为在VB.NET中,这一行实际做的不是将istream.Read(buffer,0,buffer.Length)的结果赋给变量len,然后比较len是否大于0。相反,它是比较len大于0,但是len将为0,所以这个条件永远不会成立

请尝试以下操作:

Dim buffer As Byte() = New Byte(8 * 1024 - 1) {}
Dim len As Integer = 0
len = istream.Read(buffer, 0, buf.Length)
While len > 0
  fileoutput.Write(buffer, 0, len)
  len = istream.Read(buffer, 0, buffer.Length)
End While
这样,当输入流读取下一个字节块时,它实际上会在文件输出流中写入一些内容


我希望它能有所帮助。

它之所以创建长度为0的文件,是因为它从未将任何信息写入输出流(fileoutput变量)

正如您在评论中提到的,问题与条件相符

 While (len = istream.Read(buffer, 0, buffer.Length)) > 0
这可以在C#中工作,但在VB.NET中它没有相同的行为。我认为在VB.NET中,这一行实际做的不是将istream.Read(buffer,0,buffer.Length)的结果赋给变量len,然后比较len是否大于0。相反,它是比较len大于0,但是len将为0,所以这个条件永远不会成立

请尝试以下操作:

Dim buffer As Byte() = New Byte(8 * 1024 - 1) {}
Dim len As Integer = 0
len = istream.Read(buffer, 0, buf.Length)
While len > 0
  fileoutput.Write(buffer, 0, len)
  len = istream.Read(buffer, 0, buffer.Length)
End While
这样,当输入流读取下一个字节块时,它实际上会在文件输出流中写入一些内容


我希望它能有所帮助。

它之所以创建长度为0的文件,是因为它从未将任何信息写入输出流(fileoutput变量)

正如您在评论中提到的,问题与条件相符

 While (len = istream.Read(buffer, 0, buffer.Length)) > 0
这可以在C#中工作,但在VB.NET中它没有相同的行为。我认为在VB.NET中,这一行实际做的不是将istream.Read(buffer,0,buffer.Length)的结果赋给变量len,然后比较len是否大于0。相反,它是比较len大于0,但是len将为0,所以这个条件永远不会成立

请尝试以下操作:

Dim buffer As Byte() = New Byte(8 * 1024 - 1) {}
Dim len As Integer = 0
len = istream.Read(buffer, 0, buf.Length)
While len > 0
  fileoutput.Write(buffer, 0, len)
  len = istream.Read(buffer, 0, buffer.Length)
End While
这样,当输入流读取下一个字节块时,它实际上会在文件输出流中写入一些内容


我希望这会有帮助。

你试过调用fileoutput.Flush吗?我还建议你在处理完fileoutput对象后关闭并处理它。@Crono当(len=istream.Read(buffer,0,buffer.Length))>0时,代码会跳过
fileoutput.Write(buffer,0,len)
,所以它永远不会到达
fileoutput.Write(buffer,0,len)
,刚刚意识到这一点。我该怎么办?@Crono我将对文件流使用语句,谢谢你尝试调用fileoutput.Flush?我还建议你在处理完fileoutput对象后关闭并处理它。@Crono代码跳过
而(len=istream.Read(buffer,0,buffer.Length))>0
,所以它永远不会到达
fileoutput.Write(buffer,0,len)
,只是实现了这一点。我该怎么办?@Crono我将对文件流使用语句,谢谢你尝试调用fileoutput.Flush?我还建议你在处理完fileoutput对象后关闭并处理它。@Crono代码跳过
而(len=istream.Read(buffer,0,buffer.Length))>0
,所以它永远不会到达
fileoutput.Write(缓冲区,0,le