wix - 如何删除非空文件夹

Ris*_*isa 7 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>
Run Code Online (Sandbox Code Playgroud)

不工作=(

Net*_*led 14

您应该检查RemoveFolderExUtilExtension中元素.它完全符合你的要求.Bob Arnson之前曾在博客中发表过这篇文章.

<Component Id="deeletall" Guid="PUT-GUID-HERE">
    <util:RemoveFolderEx Id="RemoveiDocDir" On="uninstall" Property="iDocDir" />
</Component>
Run Code Online (Sandbox Code Playgroud)

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

由于它可能会显着影响Windows Installer的文件成本核算,因此必须在CostInitialize标准操作之前写入临时行.遗憾的是,MSI不会在您的包中创建Directory层次结构的属性,直到稍后,在CostFinalize操作中.

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

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

还有鲍勃的帖子:

由于添加要删除的目录和文件会影响MSI的文件成本,因此RemoveFolderEx必须在成本计算之前完成其工作.不幸的是,在成本计算完成之前,MSI不会为目标目录设置属性.

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