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

时间:2015-12-14 01:57:11

标签: c zip compression posix

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

2 个答案:

答案 0 :(得分:2)

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

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

(根据用于读取zip文件的实用程序,在另一个未提及中央目录中不需要的条目的答案中的建议不一定有效。某些实用程序将读取zip文件条目信息的本地标题,并忽略中心目录。其他实用程序将反其道而行之。因此本地和中心条目信息应保持同步。)

答案 1 :(得分:1)

  

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

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

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

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

但实际上,我建议单独保留数据和元数据。