Wix - 如何删除非空文件夹

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>

无法工作 =(


你是在进行主要升级还是次要升级? - Christopher Painter
1个回答

15

你应该查看UtilExtension中的RemoveFolderEx元素,它可以实现你想要的功能。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之前运行。


警告:在“卸载”时,升级也会删除文件夹。 - Simon

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