当前位置: 首页 > 知识库问答 >
问题:

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

祁增
2023-03-14

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

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

其中GetFlages将检查当前文件的扩展名,并为我不想压缩的文件类型返回“未压缩”。这可能吗?我似乎在文档或在线中找不到任何表明它是的东西。如果没有,有没有其他直接的方法来实现这一点?

我能想到的唯一其他方法是为每种类型创建一个额外的文件行,如下所示

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个答案

白嘉石
2023-03-14

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

无论如何,可以使用预处理器生成[Files]部分。这样,您可以按文件类型更改标志。但代码也很复杂。而且由于预处理器的限制,它无法处理非常大的目录结构(我已经设法使它能够处理多达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:\source and MyDst = {app}

请参阅Inno Setup:如何查看Inno Setup预处理器的输出(转换)?

受@Zlatko Karaka的答案启发,使用Inno Setup预处理器来获取源文件路径及其子目录的文件和大小。

 类似资料:
  • 问题内容: 我想为Java的玩具语言编写一个编译器。我想生成可运行的.class文件。我想知道执行此操作的最佳库或工具是什么?我知道我可以学习所有指令的二进制格式并建立自己的常量池等,但这似乎应该已经完成​​:没必要重新发明轮子,对吗? 在线搜索我发现了两种不同的Java汇编语言Jasmin和Jamaica,但是只有Jasmin看起来有所维护。 是否存在用于将字节码写入流的Java库?这是Apac

  • 问题内容: 有没有人使用基于Java的库来生成excel文档?最好支持2003年? 问题答案: 我目前正在使用非常全面的Apache POI(http://poi.apache.org/index.html)。2003文件格式版本仍处于beta版本,但似乎运行良好。我并没有很好地利用它的功能,只是对Excel进行简单的读写,但这似乎是可靠的。

  • 问题内容: 给定2种rgb颜色和一个矩形区域,我想在这些颜色之间生成基本的线性渐变。我已经进行了快速搜索,唯一能够找到的是此Blog条目,但示例代码似乎丢失了,或者至少是在发布此信息之时。任何帮助,算法,代码示例,等等。这将用Java编写,但是显示层已经处理完毕,我只需要弄清楚如何弄清楚要显示的内容。 问题答案: 您需要在第一和第二种颜色之间进行插值。通过为每个分量(R,G,B)计算相同的插值,可

  • 问题内容: 我使用eclipse在最初独立于eclipse创建的应用程序上工作。因此,该应用程序的目录结构绝对不适合日食使用。 我想以编程方式为该应用程序生成一个项目。在和文件是很容易的弄清楚,我已经了解到,项目存储在工作区下 不幸的是,这里的某些文件(尤其是)似乎是以某种二进制格式编码的。直觉上,我尝试使用-没有骰子反序列化它。因此,它似乎不是序列化的Java对象。 我的问题是:有没有一种方法可

  • 我在尝试以编程方式安装apk并在安装后重新启动Android emulator时遇到了一些问题。我指的是这条线。 这是我的代码: 有没有办法安装apk而不启动意图?因为我正在AsyncTask的中执行上述方法。然后在中,我需要显示一个片段,说明安装成功。 然而,对于上面的代码,在调用时,它只是关闭了我的所有片段。

  • 我有Inno安装程序(在我之前写的),它提取了一组VSTO文件并开始安装VSTO MS Office插件。它有一个问题,当将VSTO文件提取到临时文件夹并启动时,它会立即显示完成按钮。如果用户单击它,临时文件将被删除,并在中开始实际安装VSTO插件,然后导致“文件未找到”错误。我应该解决这个问题(理想情况下,只有当它生成的完成执行时,Inno安装程序中的完成按钮才会出现)。 VSTO包本身(“应用