升级虽然现有文件是最新的,但如何替换现有文件?

时间:2018-03-05 07:47:18

标签: visual-studio-2015 windows-installer visual-studio-setup-proje

我使用Visual Studio 2015安装项目来安装支持升级的应用程序。我执行以下任务: 1)我通过安装将test.xml文件复制到程序文件位置 2)我今天修改了test.xml 3)我对应用程序执行升级,客户要求是复制/重写test.xml(无论是否是最新的)文件包文件(假设包文件昨天被修改)

由于现有文件最新是包文件,因此安装根本不会覆盖文件。

因此,我尝试在OnBeforeInstall()中删除此文件,以便在OnAfterInstall()中复制新文件。但是,不幸的是,安装程序在复制文件后会调用自定义操作事件处理程序。

然后,我发现有一个名为

的属性
  

条件

enter image description here

我将其定义为1(True),以便无论现有文件的修改时间如何,安装程序都可以覆盖该文件。但这也没有成功。似乎在条件评估为true之后,仍然安装程序应用文件时间戳检查,如果现有文件是最新的,它不会复制。

因此,请告诉我有没有其他方法可以完成这项工作!

1 个答案:

答案 0 :(得分:1)

一些可能的解决方案:

  1. 如果您通过添加所需的新数据进行升级,请安排您的设置更新现有的Xml文件。 Windows Installer不会覆盖更新的文件 - 没有人想要用空DB替换数据库。

  2. 更改MSI文件(使用Orca等工具)。进入InstallExecuteSequence表并将InstallExistingProducts操作从InstallFinalize之前(按顺序排序)移动到InstallInitialize之后。这将在安装所有新文件之前完全卸载旧产品,并确保适用于所有文件。

  3. 您可以更改更新Xml文件的应用程序,以便在每次更新后(或至少在升级之前)将文件的创建时间戳设置为与修改时间戳相同。然后,Windows Installer将假定它尚未更新,因此可以替换。您无法在自定义操作中执行此操作,因为正如您所发现的,在Visual Studio中,它们都在安装文件后运行。

  4. 不要在应用程序中使用已安装的Xml文件。向使用Xml文件作为模板的应用程序添加一些逻辑,并在第一次运行时将其复制到某处,然后副本就是使用的实际文件。然后安装可以覆盖未更改的文件,应用程序可以再次制作副本并使用它。