Wix Installer - 基于Property创建文件夹层次结构

时间:2012-09-18 14:00:37

标签: installer wix

我正在使用Wix 3.6来创建设置。我一直在学习。那里的信息仍然散落在周围。我只是在等待我的Wix开发者指南书的到来。

我目前有一个自定义UI对话框,用户可以在其中输入一些应用程序配置。该配置的一部分是指定日志文件夹。目前这只是设置了一个属性[LogFolder]。这默认为D:\ Logs。

我希望安装程序在运行安装程序时创建该目录。我有以下尝试这样做,但它只是在我运行安装程序时在D:驱动器上创建了一个名为[LOGFOLDER]的文件夹。

<Product ...
    <Directory Id="TARGETDIR" Name="SourceDir" >
        <Directory Id="LogFolderDir" Name="[LOGFOLDER]" >
            <Component Id="LogFolderComponent" Guid="{7E7D6916-B321-40D6-ABAD-696B57A6E5FB}" KeyPath="yes">
                <CreateFolder />
            </Component>
        </Directory>
    </Directory>
    ...
</Product>

如何使用Wix执行此操作?

3 个答案:

答案 0 :(得分:4)

第一步是创建一个设置为所需值的属性:

<Product>
  <Property Id="LOGFOLDER" Value="D:\Logs" />
</Product>

第二步是创建一个对话框,在其中设置此属性(或另一件事来更改其值):

<Dialog>
  <Control Id="Edit_LogFolder" Type="Edit" Property="LOGFOLDER" />
</Dialog>

然后,您需要更改目录结构以在默认位置创建此文件夹:

<Directory Id="ProgramFilesFolder">
  <Directory Id="INSTALLFOLDER" Name="MyApp">

    <Directory Id="LOGFOLDER" Name="Logs" />

  </Directory>
</Directory>

最后一步是创建一个将创建目录的Component,如下所示:

<ComponentGroup Id="ComponentGroup_LogFolder">
  <Component Id="Component_LogFolder" Guid="" Directory="LOGFOLDER">

    <CreateFolder Directory="LOGFOLDER" />

  </Component>
</ComponentGroup>

<强>注:

如果D:\是光盘驱动器并且您插入了光盘,则安装将失败,因为它将尝试创建该文件夹,但不会成功。

答案 1 :(得分:1)

Name属性不是formattable,因此您可以使用其中的属性。 Id'LogFolderDir'没有父节目,例如“ProgramFilesFolder”,因此它默认为具有最大磁盘空间量的卷。在这种情况下,D但是YMMV。

默认为D是危险的:因为D:可能不存在。我如何设置此目录是Id =“LOGDIR”Name =“Logs”并使其成为INSTALLDIR / INSTALLLOCATION目录元素的子项。然后在您的自定义UI中,连接另一个BrowseFolder对话框,以便用户可以覆盖它。或者,将其与所需的日志功能相关联,以便可以使用库存特征选择对话框选择要素并浏览目标文件夹。

如果您仍然希望它“默认”为D:\ Logs我要做的是有一个自定义操作,检查D:是否存在并且是固定磁盘。如果是这样,请设置LOGDIR = D:\ Logs

答案 2 :(得分:0)

通过对属性和目录使用相同的ID(无需命名目录),可以找到一种更简单的解决方案。但是,您必须在属性中使用文件夹的完整路径。

比方说,日志目录为C:\ ProgramDirectory \ Data \ Log,并且您想为Data设置一个属性(通常,如果Data的值不同并且有条件地设置)。

<Property Id="PR_DATA_DIRECTORY" Value="C:\ProgramDirectory\Data" />
<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="DIR_PROGRAM" Name="C:\ProgramDirectory" >
        <Directory Id="PR_DATA_DIRECTORY">
            <Directory Id="DIR_LOG" Name="Log" />
        <Directory/>
    </Directory>
</Directory>