我已阅读本网站上的所有主题,但是没有找到我需要的内容。
我有一个程序的两个版本:旧的和新的。 在旧版本中我有文件夹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>
不工作=(
答案 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之前运行。