Mar*_*eIV 7 c# compression zip
作为我们的安装程序构建的一部分,我们必须将数千个大型数据文件压缩成大约十或二十个"软件包",每个文件包含几百个(甚至几千个)文件,这些文件都依赖于与其他文件保存在一起.包.(如果你愿意,他们会一起版本.)
然后在实际安装期间,用户选择他们想要包含在他们系统中的包.这也让他们从我们的网站下载包作为一个大的版本化文件的更新,而不是要求他们下载数千个单独的文件,这也可能导致他们与同一个软件包中的其他人不同步.
由于这些是数据文件,其中一些在设计和编码阶段会定期更改,这意味着我们必须重新压缩该特定zip包中的所有文件,即使只有一个文件已更改.这使得我们的安装程序构建的打包步骤每次花费超过一个小时,其中大部分将重新压缩我们未触及的内容.
我们已经考虑单独保留zip包,然后替换它们中的特定文件,但是从zip中间插入和删除大文件并没有给我们带来太大的性能提升.(有点,但还不够,值得.)
我想知道是否有可能将文件预处理到缓存的原始"压缩状态",该压缩状态与写入zip包的方式相匹配,但只有数据本身,而不是zip头信息等.
我的想法是,如果可能,在我们的构建步骤中,我们将首先查找没有与之关联的压缩缓存的任何数据文件,如果没有,我们将压缩该文件并将结果写入缓存.
接下来,我们将简单地将所有缓存附加到文件流中,添加文件所需的任何适当的zip头.
这意味着我们仍在每次构建期间重新创建整个zip,但我们只是重新压缩已更改的数据.其余的只是按原样编写,因为它是一个直接的写入磁盘,所以非常快.如果数据文件发生更改,其缓存将被销毁,因此下一次构建传递将重新创建.
但是,我不确定这样的事情是否可行.是的,如果是的话,是否有任何文件显示如何尝试这样做?
是的,这是可能的。最直接的方法是将每个文件单独压缩到其自己的关联 zip 存档中,并包含一个条目。修改任何文件时,您可以替换其关联的 zip 文件以使所有文件保持最新。然后,您可以编写一个简单的程序来获取一组单条目 zip 文件并将它们合并到一个 zip 文件中。您需要参考PKZip appnote中的文档。看看那个。
现在您已经阅读了应用笔记,您需要做的是使用每个 zip 文件中的本地标头、数据和中央标头,将本地标头和数据按顺序写入新的 zip 文件,然后保存中央标头header 以及新文件中本地标头的偏移量。然后在新文件的末尾保存当前偏移量,使用您保存的中央标头写入新的中央目录,适当更新偏移量,并以中央目录开头的偏移量作为新的中央目录记录结尾。
更新:
我认为这是一篇足够有用的文章。你可以在这里得到它。