web-dev-qa-db-ja.com

Stream.CopyToとMemoryStream.WriteToの違い

_Response.OutputStream_を介して画像を返すHttpHandlerがあります。私は次のコードを持っています:

__imageProvider.GetImage().CopyTo(context.Response.OutputStream);
_

GetImage()メソッドは、実際にはStreamインスタンスであるMemoryStreamを返し、ブラウザに0バイトを返します。 GetImage()メソッドシグネチャを変更してMemoryStreamを返し、次のコード行を使用する場合:

__imageProvider.GetImage().WriteTo(context.Response.OutputStream);
_

動作し、ブラウザは画像を取得します。では、MemoryStreamクラスのWriteToとCopyToの違いは何ですか。また、GetImage()メソッドシグネチャのStreamクラスを使用してこれを機能させるための推奨される方法は何ですか。

30
jorgehmv

WriteTo()は、データをコピーする前に読み取り位置をゼロにリセットしています-一方、CopyTo()は、ストリームの現在の位置の後に残っているデータをコピーします。つまり、自分で位置をリセットしなかった場合、データはまったく読み取られません。

ほとんどの場合、最初のバージョンで次のものを逃すだけです:

memoryStream.Position = 0;
43
BrokenGlass

リフレクターによると、これはCopyTo()メソッドの定義です。

private void InternalCopyTo(Stream destination, int bufferSize)
{
    int num;
    byte[] buffer = new byte[bufferSize];
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
    {
        destination.Write(buffer, 0, num);
    }
}

ここに「残存メカニズム」はありません... thisから宛先にすべてをコピーします(バッファーサイズのブロック単位)。

12
Royi Namir