Zlib C++和提取文件

9

我开始使用zlib 1.2.5,但是没有找到从zip文件中提取的例程?我了解到有一个minizip应用程序,它是分发的一部分。

这就是预期的操作方式吗?

3个回答

26

是的,它表现得很好。(但如果您不喜欢C代码,可以查看有C++和C#代码的7-zip SDK。)

  • 所有从zip文件中浏览和解压缩文件的功能都在unzip.h中。
  • 所有压缩并添加文件到zip文件的功能都在zip.h中。

(请参见contrib\minizip\unzip.hcontrib\minizip\zip.h

例如,解压缩:

您的zip文件的unzOpen()函数将返回一个unzFile

然后在这个unzFile上使用unzGoToFirstFile()unzGoToNextFile()来浏览存档中的所有文件。

接着使用unzGetCurrentFileInfo()获取每个文件的文件信息,包括其大小。

当然,在某些时刻您应该调用unzOpenCurrentFile()

然后使用文件信息中的大小调用unzReadCurrentFile(),检索存档文件的二进制内容。

可选地,您可以提供一个不透明结构以使用自己的IO函数,但显然,有一个默认的Win32实现用于文件访问,因此您甚至不必担心这个。

另外,别忘了调用unzCloseCurrentFile()


1
好的,我找到了函数并正在使用miniunzip进行测试。我使用7zip创建了一个名为c:\a.zip的文件。它包含一个文件。我运行miniunzip -x c:\a.zip -d c:\reza,但是unzOpen2_64失败了。我在Windows上运行此操作。您有什么想法为什么会这样? - reza
这些链接已经失效。 - kberson
@kberson 感谢您的评论。我已经更新了链接,指向 https://github.com/madler/zlib/blob/master/contrib/minizip - Stephane Rolland

7

3
我已经创建了一个minizip的包装器,并添加了一些我需要的功能,使其更易于使用。它使用最新的c++11并在Visual Studio 2013中开发(应该是可移植的,但我没有在Unix上测试过)。
这里有一个完整的描述:https://github.com/sebastiandev/zipper 您可以压缩整个文件夹、流、向量等。另外一个不错的功能是完全在内存中完成所有操作。

能否使用您的包装器替换zip文件夹中的项目?我有一个情况,需要从zip中提取文件,进行一些更改并将其写回zip(覆盖现有内容),而不覆盖整个zip文件。看起来我可以先使用解压缩器类提取和修改文件,然后使用相同的文件名在压缩器类中使用添加函数来覆盖它。 - Wes
minizip没有这个功能,甚至不能从zip中删除文件。我认为zip标准提供了这样的可能性,但首先必须在minizip上实现并稍后添加到这些包装器中。这更侧重于将数据压缩成ZIP格式,特别是对于应用程序内存中的纯压缩而言,并不真正旨在用于编辑和更改ZIP文件。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接