転送後にサーバーから削除する必要がある大きなファイルの場合の WriteFile と TransmitFile
-
25-09-2019 - |
質問
ユーザーによるウェブブラウザへの大きなファイルのダウンロードをトリガーする必要があります。そこで、サーバー上に転送するファイルを作成し、その後すぐに削除します。おそらく Response.TransmitFile または Response.WriteFile を使用する必要があることがわかる十分な例を見つけました...しかし、どちらにも問題があると聞きました。
WriteFile は同期ですが、ファイルをユーザーに送信する前にメモリにバッファリングします。非常に大きなファイルを扱っているため、問題が発生する可能性があります。
TransmitFile はローカルにバッファリングしないため、大きなファイルでも機能しますが、非同期であるため、TransmitFile を呼び出した後にファイルを削除できません。ファイルをフラッシュしても、削除できるとは限りません。
これに対処する最善の方法は何でしょうか?
BinaryWriteもあります...ファイル ストリームをループしてセグメントにコピーすることはできますか?
解決
ここでTransmitFileを使用していますが、それは、デリゲートを使用して行われます一度あなたが何かをすることを可能にする優れたソリューションがあります:
ます。http://改善.dk /ブログ/ 2008/3月29日/レスポンス-transmitfile-クローズ意志-キル - あなたのアプリケーションの
ただ、ファイルの削除を最後にログを置き換えます。
他のヒント
のWriteFileは同期ですが、それ バッファメモリ内のファイルを前に、 ユーザーに送信します。アイムので、 非常に大きなファイルを扱う、これを 問題を引き起こす可能性があります。
私は、あなたが設定でWriteFile関数にバッファリングを無効にすることができると信じて Response.BufferOutput =偽;
これがfalseに設定されていたら、は、バッファリングせずにWriteFile関数を呼び出すことができるはず...
あなたはディスクにファイル(ランダムな名前など)をコミットし、送信を開始するが、これらのDBのエントリをいくつかのクリーンアップジョブの行くを持っている、あなたが定義した期間の後に、一時的なファイル名でDBテーブルにエントリを追加することができますそれが期限切れにしている場合は、ディスクからファイルを削除します。
ファイルの書き込み このメソッドは、サーバーから小さいファイルをダウンロードするために使用されます。サイズ パラメーターは、ファイルを転送する前にメモリにバッファリングする前に、ゼロから最大 Int32 値までの範囲にする必要があります。 ファイルの送信 このメソッドは、サーバーから大きなファイルをダウンロードするために使用され、ファイルをメモリにバッファリングしません。しかし、ダウンロード中にファイルを削除しようとすると、例外がスローされます。以下は、ファイルをダウンロードした後に削除するコードです。
FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
MemoryStream ms = new MemoryStream();
fs.CopyTo(ms);
context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
context.Response.ContentType = "application/octet-stream";
context.Response.BinaryWrite(ms.ToArray());
fs.Close();
File.Delete(@"D:\FileDownLoad\DeskTop.zip");