2012-09-12 35 views
5

zip文件格式以中央目录部分结尾,然后指向文件中的各个zip条目。这似乎允许zip条目发生在zip文件本身的任何地方。事实上,自解压缩zip文件就是一个很好的例子:它们以可执行文件开头,所有zip文件都在可执行字节之后发生。zip文件可以稀疏/不连续吗?

的问题是:不压缩文件格式,真正让稀疏或不连续的拉链条目?例如如果在zip条目之间有空的或者其他不明的字节?权威PK笔记和维基百科文章似乎都允许这样做。所有/最典型的压缩实用程序是否可以使用这种稀疏的zip文件?

的使用情况是这样的:我希望能够删除或zip文件中替换ZIP条目。要做到这一点,典型的minizip等图书馆希望你复制出整个zip文件,同时不复制删除或替换的zip条目,这似乎浪费和缓慢。删除或替换,你可以找出其中的未分配的字节数是直接使用这些条目中时,

岂不是更好的过度分配,说1.5倍的存储的条目,然后呢?使用1.5倍的存储空间意味着如果zip条目线性增长,重新分配也应该线性分摊。这可能与文件系统块分配类似,但可能并不复杂。

这也有助于很多基于zip的文件格式。不必在临时解压文件的某个地方(甚至在内存中)使用某个临时目录来进行编辑/更改,然后不得不将这些文件重新压缩成文件格式,这样就不需要重新压缩和重写压缩文件的某些部分文件。

是否有任何C/C++库,在那里,这样做呢?

+1

是不是过度放置存储类型打败压缩的目的? –

+0

压缩文件不是动态存储管理的最佳媒体。它是存档的。将数据一起压缩并完成。 –

+0

一些数据,例如英文文本或XML,可以压缩到10倍。如果允许整个zip文件不被重写,那么仅分配超过0.5x的额外空间仍然值得。这种过度分配可以在API级别确定,以便例如已知不太可能增加尺寸的条目可以被分配足够的空间。 –

回答

4

否。读取中央目录是可选的。 zip解码器可以,也有一些可以从头开始顺序读取zip文件,期望能够连续查看本地头文件和条目数据。他们可以完成解码工作,从来没有看过中央目录。

为了做到你想要什么,你就需要把有用的条目之间的虚拟拉链条目以认为空间。至少如果你想与其他zip世界兼容。

+0

什么会在非连续的zip文件上运行这样的zip解码器(假设没有虚拟zip条目)?如果解码器按顺序扫描zip文件中的zip条目幻数,然后对条目进行解码以确定数据的真实时间,则看起来非连续的zip仍然是兼容的。关于唯一的警告就是我必须清空空白区域以防止迷路数字混淆解码器。 –

+0

解码器不搜索幻数。它期望它将看到的下一个东西是一个幻数,它表示它是本地标题,中央目录标题还是结尾标题。如果它看到零,它将会以无效的格式错误停在那里。 –

+0

最后,我编写了我自己的Objective-C库来进行重新编辑。它不会将zip条目视为稀疏条目,但它会跳过写出未更改的zip条目。所以如果你不断地改变最后的几个条目,你将不必为从头开始重写所有条目而付费。 https://github.com/pixelglow/zipzap –