如何在不重新写整个压缩包的情况下修改一个非常大的zip文件中的单个文件?

8

我有一些包含大型文件的压缩文件。在这些压缩档案中,有一些需要修改的 "元数据" 文本文件。然而,不可能提取整个压缩文件并重新压缩它。我需要定位压缩文件内的目标文本文件,并进行编辑,可能还要将更改附加到压缩文件中。这个文本文件的文件名始终是相同的,因此可以硬编码。这是否可行?是否有更好的方法?


1
不,您不能在不重写它的情况下更改zip文件的一部分 - 例如,请参见http://www.thecodingforums.com/threads/zip-file-how-to-replace-entry-is-that-possible.391027/。 - Thomas Dickey
也许将每个单独的文件保存为自己的zip文件,长期来看可能会得到更大的文件,但仍应该比没有压缩少。 - rlam12
2个回答

6
有两种方法。首先,如果您只是想避免重新压缩整个zip文件,则可以使用任何现有的zip工具来更新存档中的单个文件。这将有效地复制整个存档,并创建一个新存档以替换条目,然后删除旧的zip文件。这不会重新压缩未被替换的数据,因此应该相对快速。至少需要与复制zip存档所需的时间相同。
如果要避免复制整个zip文件,则可以通过在zip文件中更改本地和中央头部中的名称(保持名称相同长度)为您不会使用且指示应忽略该文件的名称来有效地删除要替换的条目。例如,用波浪号替换名称的第一个字符。然后,您可以附加包含更新文本文件的新条目。这需要在zip文件末尾重写中央目录,中央目录非常小。
(另一个答案中建议不引用中央目录中不想要的条目可能无法正常工作,这取决于用于读取zip文件的工具。某些实用程序将读取zip文件条目信息的本地头部,并忽略中央目录。其他实用程序则相反。因此,应使本地和中央入口信息保持同步。)

4

压缩文件中有需要修改的“元数据”文本文件。

然而,无法提取整个压缩文件并重新压缩它。

这是一个很好的教训,当处理庞大的数据集时,将元数据与数据放在同一个位置是一个坏主意。

.zip 文件格式并不特别复杂,肯定可以替换其中的内容。问题在于新数据的大小可能会增加,不再适合旧数据的位置。因此,没有标准程序或工具可以完成此操作。

如果你足够熟练,理论上,你可以创建自己的zip处理函数,提供“文件替换”例程。如果仅涉及(较小的)元数据,则甚至不需要对它们进行压缩。 .zip"中央目录"位于文件末尾,压缩数据之后(该格式被优化为附加新文件)。总体概念是:将“中央目录”读入内存,在压缩数据后添加新的修改文件,使用修改文件的新偏移量更新内存中的中央目录,并在修改文件后写回中央目录。(旧文件仍然存在于.zip中,但不再由“中央目录”引用。)所有操作都将发生在文件末尾,而不会触及存档内容的其余部分。
但实际上,我建议将数据和元数据简单地分开。

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