8

作为我们安装程序构建的一部分,我们必须将数千个大数据文件压缩到大约十或二十个“包”中,每个包中有几百个(甚至数千个)文件,这些文件都依赖于与其他文件一起保存在包裹。(如果您愿意,它们会一起进行版本控制。)

然后在实际安装过程中,用户选择他们希望在他们的系统中包含哪些包。这也让他们可以从我们的站点下载包的更新作为一个大的版本化文件,而不是要求他们下载数千个单独的更新,这也可能导致他们与同一包中的其他人不同步。

由于这些是数据文件,其中一些在设计和编码阶段会定期更改,这意味着我们必须重新压缩该特定 zip 包中的所有文件,即使只有一个文件发生了更改。这使得我们的安装程序构建的打包步骤每次都需要一个多小时,其中大部分用于重新压缩我们没有接触过的东西。

我们已经考虑单独保留 zip 包,然后替换其中的特定文件,但是从 zip 中间插入和删除大文件并没有给我们带来那么大的性能提升。(有点,但还不够值得。)

我想知道是否可以将文件预处理为缓存的原始“压缩状态”,该状态与将其写入 zip 包的方式相匹配,但只有数据本身,而不是 zip 标头信息等。

我的想法是,如果可能的话,在我们的构建步骤中,我们将首先查找任何没有与之关联的压缩缓存的数据文件,如果没有,我们将压缩该文件并将结果写入缓存。

接下来,我们将简单地将所有缓存附加到一个文件流中,添加文件所需的任何适当的 zip 标头。

这意味着我们仍然在每次构建期间重新创建整个 zip,但我们只是重新压缩已更改的数据。其余的将按原样写入,这非常快,因为它是直接写入磁盘的。如果一个数据文件发生变化,它的缓存就会被破坏,所以下一次构建过程会重新创建它。

但是,我不确定这样的事情是否可能。是吗,如果是的话,是否有任何文件显示人们将如何尝试这样做?

4

3 回答 3

3

是的,这是可能的。最直接的方法是将每个文件单独压缩到其自己的关联 zip 存档中,并带有一个条目。当任何文件被修改时,您将替换其关联的 zip 文件以使所有这些文件保持最新。然后,您可以编写一个简单的程序来获取一组单个条目的 zip 文件并将它们合并到一个 zip 文件中。您需要参考PKZip appnote中的文档。看看那个。

现在您已经阅读了 appnote,您需要做的是使用每个单独的 zip 文件中的本地头、数据和中央头,将本地头和数据按顺序写入新的 zip 文件,并保存中央标头和新文件中本地标头的偏移量。然后在新文件的末尾保存当前偏移量,使用您保存的中央标头写入一个新的中央目录,适当地更新偏移量,并以中央目录记录的新结尾结尾与中央目录的开头偏移量.

更新:

我认为这是一个足够有用的东西来写。你可以在这里得到它。

于 2013-10-18T22:28:45.247 回答
1

您可以事先压缩每个文件,然后将它们“压缩”在一起,最后不进行压缩,以快速将它们聚合到可分发的包中。它不会像一次压缩所有数据那样有效,但进行修改应该更快。

于 2013-10-18T17:08:34.323 回答
0

我似乎无法找到实现此类功能的实际 exe。看来,我尝试过的大多数能够合并/更新的现有工具都会重新处理(压缩)数据流,正如您已经说过的那样。

但是,如果您或某人想要编写它,您所描述的似乎可以完成。如果您查看ZIP 文件格式规范的此链接,您可以大致了解您必须解析和处理的结构。看起来您可以很快地从一个文件转到另一个文件,收集并丢弃感兴趣的文件,然后合并到您的新/更新文件中。您仍然需要在新的目标存档中重建一个新的中央目录(请参阅上述链接文档的第 4.3.6 节)。

经过更多的挖掘,DotNetZip 库论坛有一条消息询问相同类型的功能,它也给出了我上面描述的描述。它还链接到此文档,这似乎表明可能会将对此的支持添加到 DotNetZip 库中,供您进一步试验。

于 2013-10-18T16:27:44.250 回答