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