0

最初に、私が尋ねようとしていることを理解する方法について調査を試みましたが、探していたものを思いつくことができませんでした. これが言われているので、私はあなたの狂った頭の良い人たちに、これを私のためにできる限り簡単に説明するように頼むと思いました.

私の問題は、ftpWebRequestを使用してファイルをダウンロードするための完全に優れた「コピー貼り付け」コードがあることです。以下のコードを貼り付けます。

        public static void DownloadFiles()
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://****/test.zip");
        request.Credentials = new NetworkCredential("****", "*****");
        request.UseBinary = true; 
        request.Method = WebRequestMethods.Ftp.DownloadFile;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        FileStream writer = new FileStream("***/test.zip", FileMode.Create);

        int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte[2048];

        readCount = responseStream.Read(buffer, 0, bufferSize);

        while (readCount > 0)
        {
            writer.Write(buffer, 0, readCount);                
            readCount = responseStream.Read(buffer, 0, bufferSize);                
        }

        responseStream.Close();
        response.Close();
        writer.Close();
    }

私が言ったように、これは完全に機能し、問題なくzipファイルをダウンロードします. 「コピーペースト」コードは恐ろしい考えだと思うので、私が理解しようとしているのは、これが実際にどのように機能しているかということです。私が理解していない唯一の部分は、これらのポイント間で実際に何が起こっているかです:

            int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte[2048];

        readCount = responseStream.Read(buffer, 0, bufferSize);

        while (readCount > 0)
        {
            writer.Write(buffer, 0, readCount);                
            readCount = responseStream.Read(buffer, 0, bufferSize);                
        }

バッファで実際に何が起こっているのか、なぜ 2048 に設定したのか、while ループが実際に何をしているのかを説明してくれる人がいれば、非常にありがたいです。私はコードを調べてメッセージボックスやその他のデバッグを入れて、何が起こっているのかを理解しようとしましたが、成功しませんでした。事前に感謝します。これが非常に初歩的であると思われる場合はお詫び申し上げます。

4

2 に答える 2

1

データはストリームから 2 kB のチャンクで読み取られ、ファイルに書き込まれます。

int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[2048]; // a buffer is created

// bytes are read from stream into buffer. readCount contains
// number of bytes actually read. it can be less then 2048 for the last chunk.
// e.g if there are 3000 bytes of data, first Read will read 2048 bytes
// and second will read 952 bytes
readCount = responseStream.Read(buffer, 0, bufferSize); 

while (readCount > 0) // as long as we have read some data
{
  writer.Write(buffer, 0, readCount); // write that many bytes from buffer to file               
  readCount = responseStream.Read(buffer, 0, bufferSize); // then read next chunk               
}
于 2013-11-06T01:22:48.817 に答える