对流缓冲区感到困惑

时间:2012-06-22 08:18:42

标签: vb.net ftp stream buffer

我正在尝试熟悉网络编程,还有什么比设计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

1 个答案:

答案 0 :(得分:1)

从流中读取时,需要捕获方法的返回值。 Read返回刚刚读取的字节数。这是您需要写入输出流所需的字节数。