あるストリームの内容を別のストリームにコピーする最適な方法は何ですか? これに標準的なユーティリティ メソッドはありますか?
ベストアンサー1
.NET 4.5以降では、Stream.CopyToAsync
方法
input.CopyToAsync(output);
これにより、Task
完了したら、次のように続行できます。
await input.CopyToAsync(output)
// Code from here on will be run in a continuation.
呼び出しがCopyToAsync
行われる場所に応じて、後続のコードがそれを呼び出した同じスレッド上で継続される場合とそうでない場合があることに注意してください。
のSynchronizationContext
通話中にキャプチャされたawait
継続がどのスレッドで実行されるかを決定します。
さらに、この呼び出し (これは変更される可能性のある実装の詳細です) は、引き続き読み取りと書き込みをシーケンスします (I/O 完了時にスレッドがブロックされることを無駄にしないだけです)。
.NET 4.0以降では、Stream.CopyTo
方法
input.CopyTo(output);
.NET 3.5 以前の場合
フレームワークにはこれを支援するものが何も組み込まれていないため、次のようにコンテンツを手動でコピーする必要があります。
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
}
}
注1: このメソッドを使用すると、進行状況(これまでに読み込まれたxバイト...)を報告できます。
注2: 固定バッファサイズを使用するのはなぜですかinput.Length
?その長さが利用できない可能性があるためです。ドキュメント:
Stream から派生したクラスがシークをサポートしていない場合、Length、SetLength、Position、および Seek を呼び出すと NotSupportedException がスローされます。