4

我正在探索 Wix# 的功能,与 Wix 相比,我对它的简单性感到震惊。我们已经在使用 QT 安装程序框架,但我们的客户也需要 MSI 安装包。

我已经有一个目录,其中包含我们产品的所有文件,并且只有一个包。我试图将所有文件包含在C:\Temp\MyProductFiles我的 MSI 安装程序中。

using System;
using WixSharp;

class Script
{
    static public void Main(string[] args)
    {
        Compiler.WixLocation= @"C:\WiX-3.7\binaries"; 
        var project = new Project("MyProduct",
                          new Dir(@"C:\Temp\MyProduct", 
                            new DirFiles(@"C:\Temp\MyProductFiles\*.*")
                           )
                      );
        project.UI = WUI.WixUI_Common;

        Compiler.BuildMsi(project);
    }
}

安装程序基本上按预期工作,但不幸C:\Temp\MyProductFiles的是包含许多子目录,我不想每次都明确说明,因为我们有几个产品。

有没有一种简单的方法可以使用 Wix# 自动包含所有文件和子目录?

也许使用 C# 也可以做到这一点,但我不精通 C#,我真的不知道如何开始。

4

2 回答 2

2

据我所知,没有内置机制来获取所有子目录,但是您可以递归遍历树,并将每个条目投影到DirFiles

IEnumerable<string> GetSubdirectories(string root)
{
    string[] subdirectories = Directory.GetDirectories(root);
    foreach (var subdirectory in subdirectories)
    {
        yield return subdirectory;
        foreach (var nestedDirectory in GetSubdirectories(subdirectory))
        {
            yield return nestedDirectory;
        }
    }
}

DirFiles投影可以输出到具有强制通配符模式的数组中:

DirFiles[] dirFiles = GetSubdirectories(rootPath).Select(d => new DirFiles(Path.Combine(d, "*.*"))).ToArray();

然后,只需传递它:

var project = new Project("MyProduct", new Dir(@"C:\Temp\MyProduct", dirFiles)));
于 2019-08-19T11:35:27.273 回答
1

要包含所有文件和子目录,请new Files("@"C:\Temp\MyProductFiles\*.*")使用new DirFiles(@"C:\Temp\MyProductFiles\*.*".

var project =
    new Project("MyProduct",
        new Dir(@"%ProgramFiles%\My Company\My Product",
            new Files(@"..\Release Folder\Release\*.*")

请参阅“发布文件夹”WixSharp 示例

这个问题也在Issue #439 - List directory with wilcards and nested DirFiles 中得到解决

于 2021-03-09T00:22:26.777 回答