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



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

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

<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 中。同一组件元素中有其他文件的原因是因为我希望另一个文件作为键路径,因此删除 FileA 不会导致该问题。现在,FileB 的生成工作正常。但是稍后在相同的自定义操作中,我在删除FileA时遇到了问题。它只是说":拒绝访问路径'DEPLOYMENT_PATH_TO_FILEA'。我认为问题出在 FileA 声明中,这就是为什么我在 File 下的 Permission 元素中添加了 Delete='yes',希望可以删除它(尽管我不确定这是否意味着在安装中可以删除)。但我仍然收到此错误。谁能告诉我我做错了什么?

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

谢谢!

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

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

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

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

最新更新