获取流到条目时的.NET ZipPackage与DotNetZip

时间:2012-03-04 15:12:37

标签: dotnetzip

我在.NET中使用ZipPackage类已有一段时间了,我非常喜欢它所拥有的简单直观的API。从条目中读取时,我执行entry.GetStream()并从此流中读取。在编写/更新条目时,我执行entry.GetStream(FileAccess.ReadWrite)并写入此流。非常简单和有用,因为我可以将读/写交给其他一些不知道Stream最初来自哪里的代码。

现在,由于ZipPackage-API不包含对LastModified等条目属性的支持,我一直在研究其他zip-api,例如DotNetZip。但我对如何使用它有点困惑。例如,当想要从条目中读取时,我首先必须将整个条目提取到MemoryStream中,寻找开头并将此流移交给我的其他代码。要写入一个条目,我必须输入ZipEntry本身可以读取的流。这似乎对我很反感。我是否以错误的方式使用此API?

ZipEntry是否可以直接从存储它的磁盘传送文件,并在读取器读取时将其解压缩?是否真的需要先将其完全提取到内存中?我不是专家,但对我来说似乎不对。

2 个答案:

答案 0 :(得分:0)

哦,我正在回答这个问题,因为我找到了答案。对于DotNetZip中我想要的这些东西,显然有方法。用于打开读取流 - > myZipEntry.OpenReader()和打开写入流 - > myZipFile.UpdateEntry(e,(fn,obj)=> Serialize(obj))。这很好。

答案 1 :(得分:0)

使用DotNetZip库不需要您将整个zip文件读入内存流。当您实例化一个ZipFile实例的实例时,如下所示,该库只读取zip文件头。 zip文件头包含上次修改等属性。以下是打开zip文件的示例。然后,DotNetZip库读取zip文件头并构建zip上所有条目的列表:

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

然后由您将zip文件解压缩到流,文件系统等。在下面的示例中,我在zipFile上使用字符串属性访问器来获取名为SomeFile.txt的zip文件。然后将匹配的ZipEntry对象提取到内存流。

MemoryStream memStr = new MemoryStream(); zip文件[ “SomeFile.txt”]提取物(memStr)。 // Response.OutputStream);

必须将Zip条目读入.NET进程空间才能被放气,没有办法通过直接进入文件系统来绕过它。与Windows资源管理器外壳zip解压缩程序的工作方式类似 - 压缩文件夹中内置的7zip或Windows的Windows外壳扩展必须将条目读入内存,然后将其写入文件系统,以便您能够打开条目。