8

我已经阅读了这个网站上的所有主题,但没有找到我需要的东西。

我有一个程序的两个版本:旧的和新的。在旧版本中,我有文件夹 f1。在新版本中,我没有这个文件夹 f1。

当新程序的安装程序检测到旧版本时,它会删除这个旧版本,但不会删除文件夹 f1。

如何从新版本的安装程序中删除 f1?

      <Component Id ="deleteall"  Guid="AA11A32B-9E1E-458A-8C94-3EFEDA77E494" >
        <RemoveFolder Id='iDocDir' On='both' />
      </Component>

      <Directory Id="iDocDir" Name="iDocs">
      </Directory>

不工作=(

4

1 回答 1

15

您应该检查RemoveFolderExUtilExtension 中的元素。它完全符合您的要求。Bob Arnson 之前曾在博客上发表过相关文章。

<Component Id="deeletall" Guid="PUT-GUID-HERE">
    <util:RemoveFolderEx Id="RemoveiDocDir" On="uninstall" Property="iDocDir" />
</Component>

它通过将临时行写入RemoveFile表来工作。但是,如手册中所述,使用它有一些限制:

因为它可能会极大地影响 Windows Installer 的文件成本计算,所以必须在 CostInitialize 标准操作之前写入临时行。不幸的是,MSI 直到稍后在 CostFinalize 操作中才为您的包中的目录层次结构创建属性。

对于在卸载期间删除文件夹的典型用例,一个简单的解决方法是将目录路径写入注册表并在卸载期间加载它。

如果您使用自定义操作来设置属性,请确保在 WixRemoveFoldersEx 自定义操作之前安排它们。

而且在 Bob 的帖子中:

由于添加要删除的目录和文件会影响 MSI 的文件成本,RemoveFolderEx 必须在成本之前做它的事情。不幸的是,MSI 在成本计算完成之前不会为目标目录设置属性。

如果您已经在注册表中保存了以前的安装路径(Rob 解释了如何在此处执行此操作),那么您很好,因为 AppSearch 操作在 CostInitialize 之前运行。

于 2013-07-30T11:26:46.517 回答