zip文件格式以中央目录部分结尾,然后指向文件中的各个zip条目。这似乎允许zip条目出现在zip文件本身的任何地方。实际上,自解压zip文件就是一个很好的例子:它们以可执行文件开头,所有zip条目都出现在可执行文件字节之后。
问题是: zip文件格式是否真的允许稀疏或非连续的zip条目?,例如如果zip条目之间有空或其他未说明的字节?最终的PK笔记和维基百科文章似乎都允许这样做。所有/大多数典型的zip实用程序都可以使用这种稀疏的zip文件吗?
用例是这样的:我希望能够删除或替换zip文件中的zip条目。为此,典型的minizip等库要求您复制整个zip文件,而不是复制已删除或替换的zip条目,这似乎是浪费和缓慢。
过度分配(比如说1.5x的条目存储空间)不是更好吗?然后当删除或替换条目时,您可以找出未分配的字节在哪里并直接使用它们?使用1.5x存储意味着如果zip条目线性增长,则重新分配也应该线性地摊销。它类似于文件系统块分配,但可能不那么复杂。
这也有助于许多基于zip的文件格式。而不是必须在某个地方(甚至在内存中)使用临时解压缩的文件进行编辑/更改然后必须将批次重新压缩回文件格式的某个临时目录,这将减少重新拉链和重写部分zip的需要文件。
是否有任何C / C ++库可以做到这一点?
答案 0 :(得分:4)
没有。读取中央目录是可选的。 zip解码器可以,有些人只需从头开始按顺序读取zip文件,期望连续看到本地标题和条目数据。他们可以完成解码工作,甚至没有查看中心目录。
为了做你想做的事,你需要在有用的条目之间加入虚拟zip条目以保存那个空间。至少如果你想与zip世界的其他部分兼容。