如何修改非常大的 zip 中的单个文件而不重写整个 zip?

Syn*_*tix 8 c compression zip posix

我有包含巨大文件的大型 zip 文件。zip 存档中有一些需要修改的“元数据”文本文件。但是,无法提取整个 zip 并重新压缩它。我需要在 zip 中找到目标文本文件,对其进行编辑,并可能将更改附加到 zip 文件中。文本文件的文件名始终相同,因此可以进行硬编码。这可能吗?有没有更好的办法?

Mar*_*ler 6

有两种方法。首先,如果您只是想避免重新压缩整个 zip 文件,则可以使用任何现有的 zip 实用程序来更新存档中的单个文件。这将需要有效地复制整个存档并使用替换的条目创建一个新存档,然后删除旧的 zip 文件。这不会重新压缩未被替换的数据,因此应该相对较快。至少,复制 zip 存档所需的时间大约相同。

如果您想避免复制整个 zip 文件,则可以通过将 zip 文件中的本地和中央标头中的名称(保持名称长度相同)更改为您赢得的名称来有效删除要替换的条目否则不要使用,这表明该文件应该被忽略。例如,用波形符替换名称的第一个字符。然后您可以使用更新的文本文件附加一个新条目。这需要重写 zip 文件末尾的中心目录,该目录非常小。

(另一个答案中建议不要引用中央目录中不需要的条目不一定有效,具体取决于用于读取 zip 文件的实用程序。某些实用程序将读取 zip 文件条目信息的本地标头,并忽略中央目录。其他实用程序将执行相反的操作。因此本地和中央条目信息应保持同步。)


Dum*_*001 4

zip 存档中有一些需要修改的“元数据”文本文件。但是,无法提取整个 zip 并重新压缩它。

这是一个很好的教训,为什么在处理大型数据集时,将元数据与数据保存在同一位置是一个坏主意。

文件.zip格式并不是特别复杂,并且绝对可以替换其中的某些内容。问题是新数据的大小可能会增加,并且不再适合旧​​数据的位置。因此,没有标准的例程或工具来实现这一点。

如果您足够熟练,理论上您可以创建自己的 zip 处理函数,以提供“文件替换”例程。如果它是关于(较小的)元数据,您甚至不需要压缩它们。的“中心目录”位于文件末尾、压缩数据之后(该格式针对附加新文件进行了优化).zip。大致概念是:将“中心目录”读入内存,将新修改的文​​件追加到压缩数据后面,用修改文件的新文件偏移量更新内存中的中心目录,将修改文件后的中心目录写回。(旧文件仍位于 中的某个位置,但不再被“中央目录”引用。)所有操作都将发生在文件的末尾,而不会影响存档内容的其余部分。.zip

但实际上,我建议将数据和元数据分开保存。