以编程方式生成Inno Setup文件标志

时间:2016-11-21 19:47:16

标签: inno-setup

在Inno Setup中是否可以通过编程方式生成文件标志?我的安装程序源包含大量目录结构中的大量文件。目前,我通过一次添加整个文件夹来最小化脚本的复杂性。这样可以正常工作,但是,整个层次结构中有许多文件没有受益于压缩(例如* .jpg),并且显着增加了安装程序的构建时间。理想情况下,我想做类似的事情:

Source: "{#MySrc}\*"; DestDir: "{#MyDst}"; Flags: {code:GetFlags};

GetFlags将检查当前文件的扩展名,并为我不想压缩的文件类型返回“nocompression”。那可能吗?我似乎无法在文档或在线中找到任何表明它的内容。如果没有,还有其他直接的方法来实现这一目标吗?

我能想到的另一种方法是为每种类型创建一个额外的文件行,比如

Source: "{#MySrc}\*"; DestDir: "{#MyDst}"; Excludes: "*.jpg,*.dds"; Flags: "ignoreversion recursesubdirs";
Source: "{#MySrc}\*.jpg"; DestDir: "{#MyDst}"; Flags: "ignoreversion recursesubdirs nocompression";
Source: "{#MySrc}\*.dds"; DestDir: "{#MyDst}"; Flags: "ignoreversion recursesubdirs nocompression";

虽然这是可行的,但每次遇到我决定不压缩的文件类型时,我都需要在几个地方进行此更改。所以,如果可能的话,我宁愿把逻辑放在一个地方。

1 个答案:

答案 0 :(得分:0)

你的解决方案还不错。如果您向我们提供详细信息,我们可能会帮助您找到不需要“每次更改几个地方”的解决方案。

无论如何,可以使用preprocessor生成[Files]部分。这样,您可以更改每个文件类型的Flags。但代码也很复杂。并且由于预处理器的限制,它不适用于非常大的目录结构(我设法使其最多可以处理3500个文件)。

#pragma parseroption -p-

#define FileFlags(FileName) \
    Local[0] = Lowercase(ExtractFileExt(FileName)), \
    (Local[0] == "jpg" || Local[0] == "dds" ? "nocompression" : "")

#define FileEntry(Source, DestDir) \
    "Source: \"" + Source + "\"; DestDir: \"" + DestDir + "\"; " + \
    "Flags: " + FileFlags(Source) + "\n"

#define ProcessFile(Source, DestDir, FindResult, FindHandle) \
    FindResult \
        ? \
            Local[0] = FindGetFileName(FindHandle), \
            Local[1] = Source + "\\" + Local[0], \
            (Local[0] != "." && Local[0] != ".." \
                ? (DirExists(Local[1]) \
                      ? ProcessFolder(Local[1], DestDir + "\\" + Local[0]) \
                      : FileEntry(Local[1], DestDir)) \
                : "") + \
            ProcessFile(Source, DestDir, FindNext(FindHandle), FindHandle) \
        : \
            ""

#define ProcessFolder(Source, DestDir) \
    Local[0] = FindFirst(Source + "\\*", faAnyFile), \
    ProcessFile(Source, DestDir, Local[0], Local[0])

#pragma parseroption -p+

根据需要修改FileFlags宏。并使用ProcessFolder宏,如:

[Files]

#emit ProcessFolder(MySrc, MyDst)

它将生成如下代码:

Source: "C:\source\file.txt"; DestDir: "{app}"; Flags: 
Source: "C:\source\subfolder\file.jpg"; DestDir: "{app}\subfolder"; Flags: nocompression
Source: "C:\source\subfolder\another.txt"; DestDir: "{app}\subfolder"; Flags: 

MySrc = C:\sourceMyDst = {app}

请参阅Inno Setup: How do I see the output (translation) of the Inno Setup Preprocessor?

灵感来自answer by @Zlatko KarakašUse Inno Setup PreProcessor to get the files and size of the source path and its subdirs