6

zip 文件格式以中央目录部分结尾,然后指向文件中的各个 zip 条目。这似乎允许 zip 条目出现在 zip 文件本身的任何位置。事实上,自解压 zip 文件就是一个很好的例子:它们以可执行文件开头,所有 zip 条目都出现在可执行字节之后。

问题是:zip 文件格式真的允许稀疏或不连续的 zip 条目吗?例如,zip 条目之间是否存在空字节或其他未计入字节?最终的 PK 说明和维基百科文章似乎都允许这样做。所有/大多数典型的 zip 实用程序都可以处理这种稀疏的 zip 文件吗?

用例是这样的:我希望能够删除或替换 zip 文件中的 zip 条目。为此,典型的 minizip 等库希望您复制整个 zip 文件,而不复制已删除或替换的 zip 条目,这看起来既浪费又缓慢。

过度分配不是更好吗,比如说 1.5 倍的条目存储空间,然后在删除或替换条目时,您可以找出未分配字节的位置并直接使用它们?使用 1.5 倍的存储意味着如果 zip 条目线性增长,则重新分配也应该线性摊销。它类似于文件系统块分配,但可能没有那么复杂。

这也有助于许多基于 zip 的文件格式。不必在某个地方(甚至在内存中)有一些临时目录以及用于编辑/更改的临时解压缩文件,然后必须将大量重新压缩回文件格式,这将减少重新压缩和重写部分 zip 的需要文件。

是否有任何 C/C++ 库可以做到这一点?

4

1 回答 1

4

不,阅读中央目录是可选的。zip 解码器可以(而且有些确实)从头开始顺序读取 zip 文件,期望连续看到本地标头和条目数据。他们可以完成解码工作,甚至从未看过中央目录。

为了做你想做的事,你需要在有用的条目之间放入虚拟的 zip 条目以保留该空间。至少如果您想与 zip 世界的其他部分兼容。

于 2012-09-12T17:40:27.763 回答