为啥不重新压缩整个文件就不能修改 zip 文件?
Posted
技术标签:
【中文标题】为啥不重新压缩整个文件就不能修改 zip 文件?【英文标题】:why can't a zip file be modified without re-zipping the entire file?为什么不重新压缩整个文件就不能修改 zip 文件? 【发布时间】:2018-02-09 06:41:07 【问题描述】:本质上不能对同一个文件进行修改或更改 zip 文件。为此,通过重新压缩整个内容,将旧文件连同新更改一起放入一个新的 zip 文件中。我想知道为什么这是必要的?为什么不重新压缩整个文件就不能修改 zip 文件?
【问题讨论】:
所使用的压缩方案本身可能会根据新文件的大小/内容而改变。此外,您需要知道在哪里附加新的压缩材料,解压缩并从源代码开始可能会更容易。 好的。所以压缩方案对于 zip 文件不是固定的? 好吧,我希望它会被修复,但事情是这样的:假设有新内容出现,通过使用不同的策略来删除冗余信息,我们可以获得比策略更小的最终 ZIP 文件用于文件的较小版本。那么我希望程序会利用这一点。 有道理 【参考方案1】:经过一番研究,似乎并非如此。事实上,Zip 文件确实允许您在不重新压缩整个存档的情况下添加/删除文件。在最常用的压缩算法“DEFLATE”中,每个文件首先被自己压缩,然后将结果拼接在一起。这意味着在跨多个文件查找模式方面失去了一些潜力,但它确实提供了更好的灵活性,这与 zip 文件的最常见用例相匹配。因此,本质上,当您添加一个新文件时,您只需压缩该单个文件,并将其添加到存档中。这与 .tar.gz
等其他格式形成对比,其中所有文件首先连接在一起 (.tar
),然后将结果压缩在一起。
来源:https://en.wikipedia.org/wiki/Zip_(file_format)
【讨论】:
是的,理论上这可能是正确的,但就我所看到的执行此操作的代码而言,会创建一个 tmp 文件并将新文件添加到此临时文件中,该文件稍后将写入原始文件的位置。从原始文件本身创建临时文件是一种开销。感谢您的洞察力 创建临时文件并不意味着重新压缩存档的其余部分,它只是意味着将现有数据复制到某个地方。复制很便宜,而且可能完成的原因是就地编辑在时间复杂度方面执行起来可能更昂贵【参考方案2】:zip 文件格式旨在允许修改条目(更改、删除、添加)不必重新压缩其他条目。所以你错了。您只需将部分或全部 zip 文件内容复制到同一文件或不同文件中,但无需重新压缩未更改的条目。
【讨论】:
以上是关于为啥不重新压缩整个文件就不能修改 zip 文件?的主要内容,如果未能解决你的问题,请参考以下文章