【问题标题】:Unable to delete deployed file during installation with WIX installer使用 WIX 安装程序安装期间无法删除已部署的文件
【发布时间】:2012-07-06 00:16:21
【问题描述】:

在我们的 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 吗?谢谢!

谢谢!

【问题讨论】:

    标签: permissions installation wix custom-action


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢克里斯托弗,他们是非常有用的建议。我将修改我的 WIX 项目。该例程是从我们现有的 Windows Installer 项目中复制的。但我也明白你的意思是在安装中删除一个部署的文件。顺便说一句,FileA 是 mdb 文件,FileB 是 mde 文件
    • 在构建过程中不能将 mdb 转换为 mde,然后只部署 mde 文件是否有原因?我在这里没有经验,所以我不知道您可能要解决的问题。
    • 说实话,我也没有这方面的经验,虽然我问过自己同样的问题。因为这就是我们当前的 Windows Installer 项目的工作方式,而我只是创建另一个部署项目的人 :) 我不熟悉 Access 编程。
    • 我会深入研究并找出答案。熟悉多种技术后,您可以执行嗅探测试并在需要时致电 BS。能够挑战和更改基线要求通常是制作真正可靠的安装程序所需要的。
    • 发布一个新问题,我会为您解答。 :)
    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多