0

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

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

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

谢谢!

4

1 回答 1

4

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

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

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

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

于 2012-07-05T23:15:32.593 回答