2012-03-04 13 views
0

.NETでZipPackageクラスを使用していましたが、シンプルで直感的なAPIが本当に好きです。エントリから読み込むときは、entry.GetStream()を実行し、このストリームから読み込みます。エントリの書き込み/更新時には、entry.GetStream(FileAccess.ReadWrite)を実行してこのストリームに書き込みます。非常にシンプルで便利なのは、ストリームが元々どこから来ているのかわからない他のコードに読み書きを渡すことができるからです。.NET ZipPackageとDotNetZipをストリームに入力するとき

ZipPackage-APIにはLastModifiedなどのエントリプロパティのサポートが含まれていないので、私はDotNetZipなど他のzip-apiを探しています。しかし、私はそれをどのように使用するかについて少し混乱しています。たとえば、エントリから読み込みたい場合は、最初にEntry全体をMemoryStreamに抽出し、最初に検索してこのストリームを他のコードに渡す必要があります。また、エントリに書き込むためには、ZipEntry自身が読み込めるストリームを入力する必要があります。これは私にとっては非常に後方にあるようです。このAPIを間違った方法で使用していますか?

ZipEntryは、ファイルが格納されているディスクから直接ファイルを引き渡し、読者が読み込むときにファイルを展開することはできませんか?最初に完全にメモリに抽出する必要がありますか?私は専門家ではありませんが、私にとっては間違っているようです。

答えて

0

Okey私は答えを見つけたので、私はこの自己に答えています。私がDotNetZipで望んでいたこれらの両方のための方法は明らかにあります。 read-stream-> myZipEntry.OpenReader()を開き、write-stream-> myZipFile.UpdateEntry(e、(fn、obj)=> Serialize(obj))を開くために。これは正常に動作します。

0

DotNetZipライブラリを使用している場合、zipファイル全体をメモリストリームに読み込む必要はありません。以下に示すように、ZipFileのインスタンスをインスタンス化すると、ライブラリはzipファイルのヘッダからのみ読み込みます。 zipファイルのヘッダーには、最後に変更されたものなどのプロパティが含まれています。次に、zipファイルを開く例を示します。 DotNetZipライブラリは、その後、zipファイルヘッダを読み取り、ジップ上のすべてのエントリのリストを構築する:(Ionic.Zip.ZipFile ZIPファイル= Ionic.Zip.ZipFile.Read(this.FileAbsolutePath))を使用して

を {。 .. }

zipファイルをストリーム、ファイルシステムなどに抽出する必要があります。下の例では、zipファイルの文字列プロパティアクセサを使用して、zipファイルを取得しますSomeFile.txt。次に、一致するZipEntryオブジェクトがメモリストリームに抽出されます。

MemoryStream memStr =新しいMemoryStream(); zipFile ["SomeFile.txt"]。Extract(memStr); // Response.OutputStream);

Zipエントリは、収縮させるために.NETプロセス空間に読み込む必要があります。ファイルシステムにまっすぐ進むことで、Zipエントリをバイパスする方法はありません。 Windowsエクスプローラシェルzip抽出プログラムの動作と同様 - 7zipまたはWindowsの圧縮フォルダに組み込まれたWindowsシェル拡張は、エントリをメモリに読み込んだ後、ファイルシステムに書き込んでエントリを開くことができます。

+0

私がDotNetZipについて読んだことのうち、ディスクから直接ストリームを解凍し、メモリにバッファリングすることなくディスクにストリーム圧縮することができるようです。しかし、私は間違っているかもしれません。これが当てはまらない場合は、DotNetZipを再度使用して再考する必要があります。私は本当に圧縮は必要ありません。私は圧縮サポートよりも直接ストリーミングを好むだろう。 –

関連する問題