【问题标题】:Generating Inno Setup file flags programmatically以编程方式生成 Inno Setup 文件标志
【发布时间】:2017-04-05 07:39:18
【问题描述】:

是否可以在 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";

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

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

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


    无论如何,使用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

    【讨论】:

    • 非常有帮助。谢谢。
    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 2018-01-29
    • 2014-08-10
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多