高级安装程序 - 更新时不覆盖文件,但卸载时删除文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级安装程序 - 更新时不覆盖文件,但卸载时删除文件相关的知识,希望对你有一定的参考价值。

我正在使用Advanced Installer 14.6并且对我的应用程序的卸载程序有以下要求: -

1)如果用户进行卸载,它会从Program Files中完全删除应用程序的文件夹,包括文件夹中的所有文件。

2)如果调用了更新过程,则将配置文件保存在应用程序的文件夹中并更新所有其他文件。

我已经尝试了很多选择来实现这一目标,但都是徒劳的。将条件UPGRADINGPRODUCTCODE设置为“不覆盖现有文件”的配置文件,当我们不希望在升级期间覆盖文件并在卸载时删除时,应该工作。但是设置此条件会在卸载时删除文件,并在更新时使用新文件覆盖该文件。

谢谢

答案

升级安装包括两部分:

  • 卸载旧产品版本
  • 安装新产品版本

要在升级期间备份某些文件,您需要通过自定义操作来处理它。

将有两个自定义操作,第一个自定义操作将在删除旧版本之前备份文件,另一个自定义操作将在安装升级版本后还原备份文件。

另一答案

您应该定义“升级”实际意味着什么。您的帖子暗示您正在进行Windows Installer主要升级,但您没有说,最重要的是,升级顺序。如果它是“早期”排序,例如在InstallInitialize之后,那么它实际上仍然是旧产品的卸载,然后安装升级,因此您丢失了配置文件。人们处理您描述的情况的方式是在升级结束时(例如在InstallExecute之后和InstallFinalize之前)对升级(RemoveExistingProducts调用)进行排序,这导致升级安装在现有产品上,并且文件覆盖遵循规则,特别是这一个:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx

这是修改后的数据文件不会被覆盖。因此,如果该配置文件在安装后已更新,则不会被覆盖。因此,假设您要保留任何更新的设置,则无需执行任何操作来保留文件。如果您仍希望在升级之前复制文件,请使用升级安装时设置的属性 - 文档不清楚,但它似乎是您在“升级操作”选项卡中设置的结果属性。

我不清楚你正在做什么“设置条件UPGRADINGPRODUCTCODE到”不要覆盖现有文件“”。升级安装中未设置UPGRADINGPRODUCTCODE属性。在卸载时,它会在旧产品中设置,以便旧产品知道它是否正在升级。它不能用于实际的传入升级设置,因为它没有设置为任何东西。

另一答案

正如菲尔所说,在升级包中使用属性UPGRADINGPRODUCTCODE是没用的。你应该使用属性OLDPRODUCTS,在Advanced Installer's user guide.的以下文章中阅读更多内容

此外,如果该文件是标准XML或INI文件,则可以使用Advanced Installer中的search support来读取用户自定义的条目和新版本编写的write them back in the config file。这样,您还可以使用新版本轻松地在此文件中包含新更新。 (不只是继续使用第一个版本安装的原始文件)

以上是关于高级安装程序 - 更新时不覆盖文件,但卸载时删除文件的主要内容,如果未能解决你的问题,请参考以下文章

安卓安装应用程序显示已存在同名文件并且无法覆盖

如果配置文件不存在,如何安装,在升级过程中不覆盖它,在卸载过程中不删除它?

inf文件 右键安装后 怎么删除或卸载

VS2008制作安装包关于覆盖安装的问题(C#)

WiX ServiceControl 在卸载时停止服务,但在安装时不启动它

安卓软件如何降级覆盖安装。