假如你不确定你是否真正理解ReserveFile了,请先认真阅读一下NSIS用户手册有关ReserveFile的说明。
好了,假设你已经阅读过了,那么请问这个ReserveFile在我们制作全图片背景界面的安装程序时是否是必须的呢?答案是:不一定。
那么你又能不能回答什么情况下需要,什么情况下不需要呢?
首先,我们先来理解一下这个ReserveFile的作用。
NSIS用户手册说ReserveFile能加快安装程序的载入,理由可以用六个字概括:靠前的先解压。
何谓靠前的先解压?这又涉及了另一个知识:固实压缩。
相信大家都喜欢在用SetCompressor时加上 /SOLID参数以提高压缩率,这样的话,所有的数据将被压缩在一个区块里,说白了,就是将所有文件合并起来再压缩。
文件合并时就有个问题,哪个文件排在前面哪个文件排在后面,很简单,由File或ReserveFile在脚本中出现的顺序决定(注意在宏中出现的不算,最终以!insertmacro的位置为准)。然后在解压的时候,如果需要将排在后面的文件解压出来则需要先解压排在前面的所有文件(注意临时文件夹会有个临时文件包含了这些解压了的文件数据)。
相信用过VNISEdit的向导的都看过这句话:“根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。”
是否可以打破这个规则,会有什么未可预知的问题,我稍候再跟大家分析,现在先来看看所有Function写在Section后面,而Function里用了File命令释放文件会有什么问题,这时如果不使用ReserveFile,Section要解压的文件是排在Function要解压的文件前面的,如果Function先于Section执行,则需要先解压所有Section的文件才再解压Function的文件,而一般Section里要释放文件的数据量是比较大的,后果就是造成安装程序初始化的缓慢,在界面显示之前起码还会出现那个“Please wait while Setup is loading...”那个对话框,而在界面显示之后(比如在页面显示函数中解压文件)就会造成界面假死。解决办法有3个:
1. 不要使用固实压缩;
2. 使用ReserveFile调整文件顺序;
3. 将释放文件的Function写在Section前面。
对于第3个,大家可能就会有疑问:这不是违反NSIS 脚本编辑规则,会出现未可预知的问题吗?这就是大家知其然而不知其所以然的问题,如果你知其所以然,完全可以打破这个规则。之所以有这个规则,是因为可能会在Function中使用到区段索引,如果你不需要使用区段索引,完全可以无视这个规则。区段索引就好比一个常量符号,需要在使用之前定义,区别就是它使用Section来定义而不是用 !define,现在,你应该知道会出现什么未可预知的问题了吧。
罗罗嗦嗦说了这么多,貌似跑题了,但我只为说明一点:要想真正的掌握一门技术,必须知其然且知其所以然。