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