HttpResponse.WriteFileメソッドパラメーターboolreadIntoMemoryは何をしますか?
この方法に出くわしたので、 MSDNのドキュメントはこの点で非常に役に立ちません。なぜこれを実行したいのか、実行したくないのかが正確にはわかりませんでした。
注:「ファイルをメモリに読み込む」と応答した場合、それ以上の説明はありません。
この方法に出くわしたので、 MSDNのドキュメントはこの点で非常に役に立ちません。なぜこれを実行したいのか、実行したくないのかが正確にはわかりませんでした。
注:「ファイルをメモリに読み込む」と応答した場合、それ以上の説明はありません。
Russは動作について正しいです-それを使用する理由は、ファイルを開いたりロックしたりしないようにするためです-特にクライアントが遅いかタイムアウトになる可能性があるため、メモリのトレードオフを行い、ファイルをバッファリングする方が望ましい場合がありますしたがって、このブール値を使用すると、ReadAllBytesを自分でバッファーに入れてから、結果のバッファーに書き込む必要がなくなります。
違いは、ファイルの内容が読み取られる時間です。
に合格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
Reflectorで見ると、応答に書き込まれる前にファイルをメモリにバッファリングする必要があるかどうかを示しているようです。
ファイルはを使用して開かFileStream
れ、そのブールフラグが設定されている場合、ファイルは最初にファイルをバイト配列に読み込んでから、を使用してその配列を応答に書き込みWriteBytes
ます。
フラグが設定されていない場合、ファイルはを使用して応答に書き込まれますWriteFile
。
前者のシナリオは両方とも、aが使用されていることを前提としHttpWriter
ています。そうでない場合は、WriteStreamAsText
が使用されます。