1

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

ZipPackage-API には LastModified などのエントリ プロパティのサポートが含まれていないため、DotNetZip などの他の zip-api を調べています。ただ、使い方が少しわかりずらかったです。たとえば、エントリから読み取りたい場合、最初にエントリ全体を MemoryStream に抽出し、先頭に移動して、このストリームを他のコードに渡す必要があります。エントリに書き込むには、ZipEntry 自体が読み取れるストリームを入力する必要があります。これは私には非常に後ろ向きに思えます。この API を間違った方法で使用していますか?

ZipEntry は、ファイルが保存されているディスクから直接ファイルを配信し、リーダーが読み取るときに抽出することはできませんか? 最初にメモリに完全に抽出する必要がありますか? 私は専門家ではありませんが、私には間違っているようです。

4

2 に答える 2

0

DotNetZip ライブラリを使用する場合、zip ファイル全体をメモリ ストリームに読み込む必要はありません。以下に示すように、ZipFile のインスタンスをインスタンス化すると、ライブラリは zip ファイル ヘッダーからのみ読み取ります。zip ファイルのヘッダーには、最終変更日などのプロパティが含まれています。zip ファイルを開く例を次に示します。次に、DotNetZip ライブラリは zip ファイルのヘッダーを読み取り、zip のすべてのエントリのリストを作成します。

using (Ionic.Zip.ZipFile zipFile = Ionic.Zip.ZipFile.Read(this.FileAbsolutePath)) { ... }

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

MemoryStream memStr = new MemoryStream(); zipFile["SomeFile.txt"].Extract(memStr); // Response.OutputStream);

Zip エントリは、圧縮するために .NET プロセス空間に読み込まれる必要があります。ファイル システムに直接アクセスしてそれをバイパスする方法はありません。Windows エクスプローラー シェルの zip エクストラクタがどのように機能するかと同様に、7zip または圧縮フォルダーに組み込まれている Windows の Windows シェル拡張機能は、エントリを開くことができるようにするために、エントリをメモリに読み取ってからファイル システムに書き込む必要があります。

于 2012-03-05T20:37:47.020 に答える
0

答えを見つけたので、私はこれに自分で答えています。DotNetZip には、私が欲しかったこれら両方のメソッドがあるようです。読み取りストリームを開く場合 -> myZipEntry.OpenReader() および書き込みストリームを開く場合 -> myZipFile.UpdateEntry(e, (fn, obj) => Serialize(obj))。これはうまくいきます。

于 2012-03-05T20:33:02.063 に答える