0

私はネットワーク プログラミングに慣れようとしていますが、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
4

1 に答える 1

1

ストリームから読み取るときは、メソッドの戻り値をキャプチャする必要があります。Read は、読み取ったバイト数を返します。これは、出力ストリームに書き込むために必要なバイト数です。

于 2012-06-22T13:55:16.450 に答える