3

HttpResponse.WriteFileメソッドパラメーターboolreadIntoMemoryは何をしますか?

この方法に出くわしたので、 MSDNのドキュメントはこの点で非常に役に立ちません。なぜこれを実行したいのか、実行したくないのかが正確にはわかりませんでした。

注:「ファイルをメモリに読み込む」と応答した場合、それ以上の説明はありません。

4

3 に答える 3

6

Russは動作について正しいです-それを使用する理由は、ファイルを開いたりロックしたりしないようにするためです-特にクライアントが遅いかタイムアウトになる可能性があるため、メモリのトレードオフを行い、ファイルをバッファリングする方が望ましい場合がありますしたがって、このブール値を使用すると、ReadAllBytesを自分でバッファーに入れてから、結果のバッファーに書き込む必要がなくなります。

于 2010-08-16T22:11:17.903 に答える
4

違いは、ファイルの内容が読み取られる時間です。

に合格trueするreadIntoMemoryと、ファイルストリームが開かれ、メモリに読み込まれて閉じられます。これらはすべて、の間に発生しWriteFileます。一方、を渡すfalseと、ファイルストリームは読み取らずに再度開かれ、閉じられます(ファイルが存在することを確認するためだけに)。代わりに、書き込むファイルに関する情報が(内部HttpWriter.WriteFileメソッドを使用して)内部バッファーに渡されます。後で(おそらく応答がフラッシュされたときに、これを確認していません)、ファイルの内容が読み取られます。

次のコードを検討してください。

protected void Page_Load(object sender, EventArgs e)
{
    Response.WriteFile(@"C:\myFile", false);
    System.IO.File.Move(@"C:\myFile", "C:\myFile2");
    Response.End();
}

ブラウザは応答を受け取らないことに注意してください。つまり、の間に何かがひどく悪くなりResponse.Endます。この問題を回避するように設定readIntoMemoryします。true

于 2010-08-16T22:23:26.800 に答える
2

Reflectorで見ると、応答に書き込まれる前にファイルをメモリにバッファリングする必要があるかどうかを示しているようです。

ファイルはを使用して開かFileStreamれ、そのブールフラグが設定されている場合、ファイルは最初にファイルをバイト配列に読み込んでから、を使用してその配列を応答に書き込みWriteBytesます。

フラグが設定されていない場合、ファイルはを使用して応答に書き込まれますWriteFile

前者のシナリオは両方とも、aが使用されていることを前提としHttpWriterています。そうでない場合は、WriteStreamAsTextが使用されます。

于 2010-08-16T22:04:25.970 に答える