2017-07-18 6 views
1

I持ってFTPサーバーからファイルをダウンロードし、次のコード:WebRequest.GetResponseStream私はメモリやネットワークから読んでいますから、私は、ストリームから読み込まれた場合

var req = (FtpWebRequest)WebRequest.Create(ftp_addr + file_path); 
req.Credentials = new NetworkCredential(...); 
req.Method = WebRequestMethods.Ftp.DownloadFile; 

using (var resp = req.GetResponse()) 
using (var strm = resp.GetResponseStream()) 
using (var mem_strm = new MemoryStream()) 
{ 
    //The Web Response stream doesn't support seek, so we have to do a buffered read into a memory stream 
    byte[] buffer = new byte[2048]; 
    int red_byts = 0; 
    do 
    { 
     red_byts = strm.Read(buffer, 0, 2048); 
     mem_strm.Write(buffer, 0, red_byts); 
    } 
    while (strm.CanRead && red_byts > 0); 

    //Reset the stream to position 0 for reading 
    mem_strm.Position = 0; 
    //Now I've got a mem stream that I can use 
} 

生ストリームがGetResponseStream」から返されたので、 "読んだり、探したりすることができません(それを求めることはできません)。このコードは実際には、ファイルの次のチャンクの要求をFTPサーバーに実行して、それをメモリにコピーしているようです。私は正しいのですか、GetResponseStreamができるときに応答全体がダウンロードされていますか?

私が知りたいのは、FTPダウンロードを使用する非同期メソッドでReadAsync呼び出しを正しく待機できることです。私の直感は、行を変更する私に語った:

red_byts = strm.Read(...); 

red_byts = await strm.ReadAsync(...); 

にWebRequest.GetResponseStreamのドキュメントは指定していないように、またFtpWebRequest.GetResponseStreamのマニュアルを行います。

答えて

1

生ストリームはネットワークストリームである必要があります。これを確認するには、strm.GetType().Nameをチェックしてください。

このコードは実際にファイルの次のチャンクに対する要求をFTPサーバーに送信してメモリにコピーしているようです。私は正しいのですか、GetResponseStreamができるときに応答全体がダウンロードされていますか?

どちらもありません。

それはがRead/ReadAsyncに呼び出しごとに個別のリクエストを送信しないです。むしろ、要求は1つしかなく、ストリームは1つの応答の本体を表します。

またGetResponseStreamから戻る前に応答全体をダウンロードないです。むしろ、ストリームはダウンロードを表します。 バッファリングが行われています - サーバがデータを送信しているので、ネットワークスタックとBCLがあなたのためにそれを読み込んでいますが、開始ストリームを読むまでにはダウンロードが保証されません。

私は正しく、FTPダウンロードを使用する非同期メソッドでReadAsync呼び出しを待つことができます。私の直感は[asyncを使う]と伝えます

はい、非同期読み取りを使用してください。すでにバッファリングされているデータがある場合、それらは同期して完了することがあります。それ以外の場合は、サーバーがより多くのデータを送信するまで待機する必要があります。

関連する問題