wix - 如何删除非空文件夹

时间:2013-07-30 07:03:41

标签: c# wix

我已阅读本网站上的所有主题,但是没有找到我需要的内容。

我有一个程序的两个版本:旧的和新的。 在旧版本中我有文件夹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>

不工作=(

1 个答案:

答案 0 :(得分:13)

您应该查看RemoveFolderEx element in the UtilExtension。它完全符合你的要求。 Bob Arnson has blogged about it before.

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

它的工作原理是将临时rowes写入RemoveFile表。但是,正如手册中所述,使用它有一些限制:

  

因为它可能会显着影响Windows Installer的文件成本核算,   必须在CostInitialize标准之前写入临时行   行动。不幸的是,MSI没有创建属性   包中的目录层次结构,直到稍后,在CostFinalize中   动作。

     

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

     

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

还有鲍勃的帖子:

  

添加要删除的目录和文件会影响MSI的文件   成本计算,RemoveFolderEx必须在成本计算之前完成它的工作。   不幸的是,MSI没有为目标目录设置属性   直到成本计算完成后。

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