0

重複の可能性:
2 つの Stream インスタンス間でコピーする最良の方法 - C#

私は File.Copy を使用できることを知っていますが、教育目的のためだけに、より長い方法でそれを行うことにもっと興味があります。

ここで説明したいアプローチは、StreamReader と StreamWriter (または FileStreams) を使用することです。

私の考えでは、ファイルを (バイナリとして) メモリに読み込み、そのファイルを新しい場所に書き込みます。
これは、 1)ファイル全体がメモリにロードされているため(そしてファイルの大きさがわからない)、
2)バイトをコピーしてバイトを貼り付けるようなものと比較して時間がかかるため、エラーの可能性があると思います(これがストリーミングの仕組みだと思います)貼り付けが始まる前に、ファイル全体がメモリに保存されるのを待たなければならないからです。

では、長い質問ですが、コピー アンド ペースト ジョブをストリーミングするにはどうすればよいでしょうか?

4

3 に答える 3

4

では、長い質問ですが、コピー アンド ペースト ジョブをストリーミングするにはどうすればよいでしょうか?

各バイトを個別にメモリに読み込むか、ファイル全体をメモリに読み込む代わりに、32K などのバッファを作成し、入力ストリームにその量のデータを読み込むように要求します。読み取ったバイト数を書き出し、読み取るデータがなくなるまで繰り返します。次のようなものです:

public void Copy(Stream input, Stream output)
{
    byte[] buffer = new byte[32 * 1024];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}

これは、読み取りと書き込みを同時に行っていないため、潜在的に効率的ではありません。非同期IOはそれを修正しますが、それをはるかに複雑にします-とにかく、書き込み中にOSが読み取りを続けるのに十分なほどスマートになる可能性は十分にあります...

実際にテキストを読んでいる場合を除き、 /Streamではなく必ず使用したいことに注意してください。TextReaderTextWriter

于 2012-10-10T13:42:23.217 に答える
2

ファイルは 1 MB 単位で読み書きできます (たとえば)。MSDN には、その方法を示す例があります。

于 2012-10-10T13:43:24.613 に答える
1
  1. 空の宛先ファイルを作成する
  2. ソースファイルからバッファを読み取ります (1024 バイトとしましょう)
  3. 宛先ファイルにバッファを書き込みます
  4. すべてが完了するまで 2 を繰り返します
于 2012-10-10T13:42:36.310 に答える