使用WIX安装程序在安装期间无法删除已部署的文件

时间:2012-07-05 14:55:09

标签: permissions installer wix custom-action

在我们的WIX安装程序项目中,我们需要生成一个新文件,让我们称之为FileB,基于已部署的文件,在托管自定义操作函数中称为FileA。换句话说,在组件声明中,我声明了FileA。在自定义操作(在提交阶段发生)时,我需要基于FileA生成FileB。之后,由于FileA不再使用,我想在同一个自定义操作中删除它。

问题出现了:使用默认安装文件夹,即Program Files,普通用户不允许在自定义操作中将文件(生成FileB)添加到此文件夹中(我不是100%确定我是对的,但在我的测试中就是这种情况。如果我将它安装在另一个文件夹中,则根本没有问题)。所以我想我需要授予创建文件的权限。为此,我将一个CreateFolder元素添加到包含FileA的组件中。整个组件声明是这样的:

<Component Id='COMPONENT_NAME' Guid='MY_GUID'>
    <!--OTHER FILES IN THE COMPONENT-->
    ...
    <CreateFolder Directory='INSTALLDIR'>
      <Permission CreateFile='yes' User='Everyone' GenericAll='yes' Delete='yes'/>
    </CreateFolder>
    <File Id='MyFileA' Name='FileA'   Source='PATH_TO_FILEA' KeyPath='no' >
      <Permission GenericAll='yes' User='Everyone' Delete='yes'/>
    </File>
  </Component>

组件实际上属于组件组,它位于INSTALLDIR中。在同一组件元素中存在其他文件的原因是因为我希望另一个文件成为keypath,因此删除FileA不会导致问题。现在FileB的生成工作正常。但是后来在同一个自定义操作中,我在删除FileA时遇到了问题。它只是说“:拒绝访问路径'DEPLOYMENT_PATH_TO_FILEA'。”我认为问题出在FileA声明中,这就是为什么我在File下的Permission元素中添加了Delete ='yes',希望能删除它(虽然我不确定这是否意味着在安装中它是可能的删除)。但我仍然得到这个错误。谁能告诉我我做错了什么?

另一个问题是,我真的不知道那些CreatFolder元素的目的是什么。首先:如果目标是创建目录结构,我认为(嵌套)目录元素已经这样做了。为什么在Component元素下有这样的元素,大多数时候你可能希望将目录结构与组件结构分开(组件只使用目录引用来引用正确的目录)。其次,CreateFolder的默认Directory属性是组件所在的父Directory。但是通常有多个组件驻留在同一目录中,就像我在这里一样:多个组件在同一个组件组中,其目录元素引用INSTALLDIR。因此,这些组件中只有一个具有CreateFolder元素,在我的情况下,其Directory属性是所有这些组件的父目录。这个结构真的很难理解。我想我对CreateFolder元素有一些误解。有人可以启发我使用CreateFolder吗?谢谢!

谢谢!

1 个答案:

答案 0 :(得分:4)

这里要解决的一些问题。首先,您应该知道,如果禁用回滚,则不会执行提交阶段自定义操作。您应该有一个延迟和回滚自定义操作。

其次,您不能告诉MSI安装文件然后删除它。这会适得其反,只会导致维修问题。更好的解决方案(我假设您使用的是WiX DTF管理的自定义操作)是将FileA作为自定义操作项目中的内容项包含在内。这将导致文件在执行时存在于自定义操作的当前(临时)目录中。然后,您可以生成fileb。对于回滚,您可以删除fileb。

您还需要创建一个RemoveFile元素来教MSI在卸载时删除该文件。否则它不会,因为MSI对您的进程外自定义操作创建的fileb一无所知。

否则知道fileb的内容是有用的。如果这是一个可以作为fileb安装然后使用xml wix扩展名进行转换的xml文件,那么实现会更容易。