2012-02-07 10 views
3

私はたくさんのファイルを圧縮し、ストリーム経由でデータを消耗させようとしています。DotNetZipストリーミング

可能な限りメモリフットプリントを小さくしたいと思います。

私のアイデアは、データメンバーとしてFileStreamオブジェクトがたくさんあるStreamを実装することでした。私のストリーム上のReadメソッドが呼び出されたとき、私は自分のファイルストリームの1つからいくつかのデータを読み込み、ZipOutputStreamインスタンスを使用して、一時的なストレージストリームに書き込みデータを書き込んだり、

この一時記憶ストリームはバイトのキューに過ぎません。これらのバイトが(Readへの呼び出しを介して)バッファに移動されると、それらはキューから削除されます。この方法では、まだ読み込まれていないバイトだけを格納していました。

残念ながら、ZipOutputStreamを処分すると、有効なzipファイルを作成するためにランダムなファイルの場所に書き込む必要があるようです。これにより私の「一瞬のデータ」ソリューションを使用できなくなります。

うまくいけば、これはすべて明確:)

は、zipファイルを作成するときにメモリフットプリントを最小限にする別の方法はありますか?助けてください!

ありがとうございます!

答えて

1

ZipOutputStream出力ストリームのランダムな場所に書き込む必要はありません(換言すれば、Seek())。しかし、書き込みしようとしているストリームがCanSeekであると報告している場合は、そのヘッダを更新する機能を使用します。

したがって、書き込み先のストリームがCanSeek()の場合はfalseを返し、すべて正常に動作するはずです。

+0

有効なzipファイルを生成するには、ZipOutputStreamでdispose()を呼び出す必要があります。 dispose()はシークする必要がない場合、何をしますか? – Jordan

+0

通常の出力ストリームと同様です。バッファをフラッシュする必要があります。また、ファイル形式に必要なフッターも書き込む。 – svick

+0

これは主に働きました...私はすべてのバグを修正しました。これは、Ionic.Zip.CountingStreamでシーク不可能なストリームを強制的にラップするように強制されたようです。これがなぜなのか? – Jordan