尽管现有文件是最新的,但升级时如何替换现有文件?
How to replace existing file when upgrading though the existing one is latest?
我使用Visual Studio 2015 Setup Project 安装支持升级的应用程序。我执行了以下任务:
1) 我通过安装将 test.xml 文件复制到程序文件位置
2)我今天修改了test.xml
3)我对客户要求copy/over写入test.xml(无论是否最新)文件和包文件进行升级(假设包文件昨天被修改)
由于现有文件比包文件最新,所以安装根本不会覆盖文件。
因此,我尝试在 OnBeforeInstall() 中删除此文件,以便在 OnAfterInstall() 中复制新文件。但是,不幸的是,安装程序会在复制文件后调用自定义操作事件处理程序。
然后,我发现有属性叫
Condition
我定义了 1 (True),这样无论现有文件的修改时间如何,安装程序都可以覆盖文件。但这也没有成功。似乎在条件评估为真后,安装程序仍然应用文件时间戳检查,如果现有文件是最新的,它不会复制。
因此,请让我知道是否还有其他方法可以完成此工作!
一些可能的解决方案:
如果您通过添加所需的任何新数据进行升级,请安排您的设置更新现有的 Xml 文件。 Windows 安装程序不会覆盖更新的文件 - 没有人愿意用空数据库替换充满数据的数据库。
更改 MSI 文件(使用 Orca 等工具)。进入 InstallExecuteSequence table 并将 RemoveExistingProducts 操作从 InstallFinalize 之前(按 Sequence 排序时)移动到 InstallInitialize 之后。这将在安装所有新文件之前完全卸载旧产品,因此请确保它适用于您的所有文件。
您可以更改更新 Xml 文件的应用程序,以便在每次更新后(或至少在升级前)将文件的创建时间戳设置为与修改时间戳。然后 Windows 安装程序将假定它尚未更新,因此可以被替换。您不能在自定义操作中执行此操作,因为正如您发现的那样,在 Visual Studio 中,它们都在安装文件后 运行。
不要在应用程序中使用已安装的 Xml 文件。向使用 Xml 文件作为模板的应用程序添加一些逻辑,首先 运行 将其复制到某处,然后复制的是实际使用的文件。然后安装可以覆盖未更改的文件,应用程序可以再次制作副本并使用它。
我使用Visual Studio 2015 Setup Project 安装支持升级的应用程序。我执行了以下任务: 1) 我通过安装将 test.xml 文件复制到程序文件位置 2)我今天修改了test.xml 3)我对客户要求copy/over写入test.xml(无论是否最新)文件和包文件进行升级(假设包文件昨天被修改)
由于现有文件比包文件最新,所以安装根本不会覆盖文件。
因此,我尝试在 OnBeforeInstall() 中删除此文件,以便在 OnAfterInstall() 中复制新文件。但是,不幸的是,安装程序会在复制文件后调用自定义操作事件处理程序。
然后,我发现有属性叫
Condition
我定义了 1 (True),这样无论现有文件的修改时间如何,安装程序都可以覆盖文件。但这也没有成功。似乎在条件评估为真后,安装程序仍然应用文件时间戳检查,如果现有文件是最新的,它不会复制。
因此,请让我知道是否还有其他方法可以完成此工作!
一些可能的解决方案:
如果您通过添加所需的任何新数据进行升级,请安排您的设置更新现有的 Xml 文件。 Windows 安装程序不会覆盖更新的文件 - 没有人愿意用空数据库替换充满数据的数据库。
更改 MSI 文件(使用 Orca 等工具)。进入 InstallExecuteSequence table 并将 RemoveExistingProducts 操作从 InstallFinalize 之前(按 Sequence 排序时)移动到 InstallInitialize 之后。这将在安装所有新文件之前完全卸载旧产品,因此请确保它适用于您的所有文件。
您可以更改更新 Xml 文件的应用程序,以便在每次更新后(或至少在升级前)将文件的创建时间戳设置为与修改时间戳。然后 Windows 安装程序将假定它尚未更新,因此可以被替换。您不能在自定义操作中执行此操作,因为正如您发现的那样,在 Visual Studio 中,它们都在安装文件后 运行。
不要在应用程序中使用已安装的 Xml 文件。向使用 Xml 文件作为模板的应用程序添加一些逻辑,首先 运行 将其复制到某处,然后复制的是实际使用的文件。然后安装可以覆盖未更改的文件,应用程序可以再次制作副本并使用它。