WiX安装程序在卸载时删除文件,但在升级时不删除。

12

我有一个由WiX安装程序安装的程序。

该程序会在[CommonAppDataFolder]\[MyAppName]\目录下创建多个文件,这些文件都有相同的扩展名(假设叫.dat)。

升级时,我希望能够保留这些文件。
卸载时,我希望删除这些文件。

我当前是通过以下方式删除这些文件:

<Directory Id='CommonAppDataFolder'>
  <Directory Id='MyCommonAppDataFolder' Name='MyAppName'>
    <Component Id='RemoveFilesComponent' Guid='71cb0cd8-8459-4a8f-89b7-f00977aa7b70'>
      <RemoveFile Id='RemoveFiles' Name='*.dat' On='uninstall'/>
    </Component>
  </Directory>
</Directory>

我有以下代码来协助升级:

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallInitialize'/>
</InstallExecuteSequence>

现在,当我卸载时,.dat文件会被正确删除。
然而,当我升级时,.dat文件也被删除了。我猜这是因为升级执行了对之前版本的卸载。

我是否正确地解决了这个问题?如何在升级时保留文件,同时在卸载时删除它们?


你有没有找到解决这个问题的方法? - darbid
很久以前,但我记不清了。我想我最终只是在卸载后将文件留在CommonAppDataFolder中。 - Matthew King
感谢Matt的回答。 - darbid
2个回答

2

您试过在RemoveExistingProducts中添加条件吗?这是我会做的。

<RemoveExistingProducts After='InstallInitialize'>(NOT UPGRADINGPRODUCTCODE) AND (Installed)</RemoveExistingProducts>

1
这似乎是我想要的,但这意味着在升级时之前的版本并未被删除。例如,我最终在“添加或删除程序”控制面板中会有多个条目与我的应用相关。有什么解决方法吗? - Matthew King
1
你可以尝试将“remove existing product”移动到"After InstallFinalize"。这将删除任何更改过的文件和注册表设置,但保留未更改的内容。这也可能与你的ProductID或版本有关。操作系统可能认为它是完全不同的程序。 - Scott Boettger
升级是内部卸载和重新安装吗?还是覆盖DLL /文件? - kudlatiger

1

一个选择是切换到小更新。这有很多限制,所以并不像听起来那么容易。


1
你的答案可能在wix burn的早期阶段之前,所以我想知道你是否现在可以用不同的方式回答这个问题。一个可能的解决方案是创建一个带有2个msi包的wix引导程序。他的.dat文件将在第二个msi包中,并且不会被升级。 - darbid
如果原始软件包的发货方式不同,那么可以做很多事情。我回答时假设他需要处理已经发货的内容。 - Rob Mensching
@RobMensching,有没有关于未发货包裹的答案?(目前正在开发中)这将非常有帮助。谢谢! - Eli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接