4

私はいくつかのコードをリファクタリングしていますが、いくつかのコメントを使用できる質問があります。

元のコードはファイルをストリームにダウンロードします。次に、一時ディレクトリのファイルにストリームを書き込み、File.Copy を使用して運用ディレクトリの既存のファイルを上書きします。

すぐにストリームを本番ディレクトリに書き込むのとは対照的に、最初に一時ディレクトリに書き込み、File.Copy を使用することには利点がありますか?

理由の 1 つは、File.Copy がストリームの書き込みよりも高速であり、書き込み中に誰かがファイルを読み取る可能性を減らしていることです。しかし、それは起こりえますか?他に何を念頭に置いておく必要がありますか。一時ディレクトリを除外することを検討しています。

MemoryStream stream = new MemoryStream();
....Download and valiate stream....
using (Stream sourceFileStream = stream)
{
    using (FileStream targetFileStream = new FileStream(tempPath, FileMode.CreateNew))
    {
        const int bufferSize = 8192;
        byte[] buffer = new byte[bufferSize];
        while (true)
        {
              int read = sourceFileStream.Read(buffer, 0, bufferSize);
              targetFileStream.Write(buffer, 0, read);

              if (read == 0)
                  break;
        }
    }

}
File.Copy(tempPath, destination, true);

ストリームを宛先に書き込むだけとは対照的です。

これは私が持っていたコードです。次のようなものを適切に使用しますsourceFileStream.CopyToAsync(TargetFileStream);

4

3 に答える 3

6

ダウンロードを開始して既存のファイルをオーバーライドするとどうなるかを考えてみてください。その後、何らかの理由でダウンロードが中止され、破損したファイルが残ります。ただし、最初に別の場所にダウンロードしてターゲット ディレクトリにコピーすると、問題が発生します。

編集:さて、コードを見てください。ファイルが既に MemoryStream にある場合、ファイルを一時的な場所に書き込んでコピーする理由はありません。あなたはただすることができますFile.WriteAllBytes(destination,stream.ToArray());

于 2013-05-02T22:28:33.343 に答える
1

File.Copyストリームなどの使用法をカプセル化するだけです。まったく違いはありません。

于 2013-05-02T22:53:29.120 に答える