Wix - 如何防止覆盖整个目录?

时间:2012-04-10 10:05:50

标签: wix wix3.5

我有wix安装程序,它将一些文件复制到某些目录。每个文件都声明为单个组件,有一些路径 - 如果目录不存在,安装程序将创建它并将文件放在那里。

我想做什么:如果目录已经存在,安装程序不应该复制任何文件(即使文件不存在,也不应该复制到现有目录)。

但是不可能将“Never overwrite”设置为目录,那么如何防止将新文件复制到现有目录?我可以在这里使用任何条件(例如“是否存在目录”)?

2 个答案:

答案 0 :(得分:1)

  

我可以在这里使用任何条件(例如“是否存在目录”)?

是的,你可以使用这样的Condition元素:

<Directory Id="FooFolder" Name="Foo">
    <Component Id="SomeId">
        <File Source="..." />
        <Condition>Not FOO_FOLDER_ALREADY_EXISTS</Condition>
    </Component>
</Directory>

Windows安装程序的Conditional Statement Syntax文档中说明了可以用作条件的内容。

在这种情况下,我相信您可以将FOO_FOLDER_ALREADY_EXISTS属性设置为DirectorySearch,如下所示:

<Property Id="FOO_FOLDER_ALREADY_EXISTS">
    <DirectorySearch Id="FooFolderSearch" Path="[FooFolder]" />
</Property>

<击>

修改:显然上面的目录搜索不起作用,因为[FooFolder]属性仅在CostFinalize操作期间解决(请参阅documentation)。但是在AppSearch操作期间,目录搜索已经在此之前发生。

我不确定如何解决这个问题。它可能涉及在CostFinalize之后使用自定义操作而不是Windows安装程序目录搜索来设置FOO_FOLDER_ALREADY_EXISTS属性。

答案 1 :(得分:0)

关于如何避免在成本最终确定之前设置属性的计时问题,另一种可靠的处理方法是将属性写入注册表。

我认为这是关于属性设置的时间问题的最常见的工作,它允许安装程序跟踪卸载的这些属性等...我已经用它来产生很好的效果。

以下a good article by Rob Mensching介绍了如何帮助您入门。