我正在尝试熟悉网络编程,还有什么比设计FTP客户端代码库更好的起点?
到目前为止,我的表现并不是很好。我正在尝试创建一个方法,将文件从远程服务器下载到本地文件路径。为此,我能找到的所有示例都声明了一个用作数据缓冲区的字节数组。我完全理解这样做的意义,而不是每字节读取和写入字节,但我无法让它工作。每当我设置一个大于1个字节的缓冲区时,输出就会被破坏(不同的校验和,媒体文件不会播放等)。
有人可以指出我在这里做错了什么:
Public Function DownloadFile(source As Uri, output As Uri) As FtpStatusCode
Dim request = FtpWebRequest.Create(source)
request.Method = WebRequestMethods.Ftp.DownloadFile
Using response As FtpWebResponse = CType(request.GetResponse, FtpWebResponse)
Using outputStream = New FileStream(output.AbsolutePath, FileMode.Create)
Do
Dim buffer(8192) As Byte
response.GetResponseStream.Read(buffer, 0, buffer.Length)
outputStream.Write(buffer, 0, buffer.Length)
Loop While outputStream.Position < response.ContentLength
End Using
Return response.StatusCode
End Using
End Function
因为当我将缓冲区大小设置为1时,此代码确实有效,所以我觉得字节顺序出现了问题。但是所有这些代码都是同步的,那么这怎么可能......
修改
我现在就开始工作了,所以这里是未来参考的代码解决方案(再次感谢@tcarvin):
Public Function DownloadFile(source As Uri, output As Uri) As FtpStatusCode
Dim request = FtpWebRequest.Create(source)
request.Method = WebRequestMethods.Ftp.DownloadFile
Using response As FtpWebResponse = CType(request.GetResponse, FtpWebResponse)
Using inputStream = response.GetResponseStream
Using outputStream = New FileStream(output.AbsolutePath, FileMode.Create)
Do
Dim buffer(8192) As Byte
Dim buffered = inputStream.Read(buffer, 0, buffer.Length).Read(buffer, 0, buffer.Length)
outputStream.Write(buffer, 0, buffered)
Loop While outputStream.Position < response.ContentLength
End Using
End Using
Return response.StatusCode
End Using
End Function
答案 0 :(得分:1)
从流中读取时,需要捕获方法的返回值。 Read返回刚刚读取的字节数。这是您需要写入输出流所需的字节数。