メモリストリームなしでファイルをzipファイルに保存する方法をお探しです。私の目標は最大のシステムメモリを節約することですが、ダイレクトディスクIOは問題ありません。 私はいくつかのブロブを収集したデータベースの結果セットを反復処理します。これらはバイト配列です。メモリストリームなしでファイルとZIPを生成
using (var archive = ZipFile.Open("data.zip", ZipArchiveMode.Update))
{
foreach (var result in results)
{
string fileName = $"{result.Id}.bin";
using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
// write the blob data from result.Value
fileStream.Write(result.Value, 0, result.Value.Length);
fileStream.Close();
}
archive.CreateEntryFromFile(fileName, fileName);
}
}
この実装と2つの問題があります。私はそれが(System.IO.Compression)以下かどう
。私は私の* .binのファイルを持っている、もう1つは* .zipファイル(ZIPのみを必要とする)
- (私はなぜ知らないが、これは多くのRAMを使用しています〜15x1.5MBビンのための100メガバイトファイル)
完全にメモリをバイパスする方法はありますか?
UPDATE:
私が達成しようとしているどのようなデータベースの塊から生成された単一のバイナリファイルが含まれている1つのZIPファイルを生成することです。これは、ASP.NET Web APIコントローラ内で発生する必要があります。ユーザーはデータを要求できますが、HTTP応答でデータ全体を送信する代わりに、リクエスト時にZIPファイルを生成し、ローカルファイルサーバーに保存してユーザーにダウンロードリンクを送り返します。
それはあなたが達成しようとしているものは不明だ - あなたは '... bin'でファイルを作成したくない場合は、なぜそのファイルを明示的に作成している新しい 'FileStream'を作成していますか? –
これは、ILSPYを使用して通話を確認することによってCLRが実際に行っていることを確認するのに役立ちます。しかし私のために、あなたが達成しようとしていることを明確にしていません。 –
@JonSkeet私はそれに一つのbinファイルを持つzipファイルが必要です。多分もっと洗練された解決策があるかもしれません(と私は願っています)。すべてのデータベース結果に対して単一のZipEntrieyオブジェクトを作成します。私はメモリ消費なしでそれを行う必要があります。したがって、ファイルシステム上にファイルを作成することは良いスタートだと思われます。さもなければ私はそれらを記憶にとどめなければならない。または私は間違っていますか? – marrrschine