Inno Setup:为文件夹及其子文件夹中的所有文件动态添加组件

耶利米·格罗特

Inno Setup:动态添加文件夹中的所有文件并添加组件标签,因此在运行安装程序期间,用户可以选择自定义安装程序并选择要复制的文件。

我想创建一个Inno Setup文件,该文件将抓取用户可以放在其中的文件夹中的文件,而不必在每次添加新文件时都修改Inno Setup文件。同时,我需要安装文件的用户能够选择要复制的文件。

如果我做这样的事情:

Source: "D:\SomeDirectory\*"; DestDir: "{app}"; \
   Flags: ignoreversion recursesubdirs createallsubdirs; Components: dlls

自定义安装程序仅显示复制或不复制整个文件夹的选项。

马丁·普里克里(Martin Prikryl)

假设文件在编译时可用,则可以使用Inno Setup Preprocessor递归宏来生成[Files][Components]部分。

此代码部分基于以编程方式生成Inno Setup文件标志

#pragma parseroption -p-

#define FileEntry(Source, Dest) \
    Local[0] = Copy(Dest, 2, Len(Dest) - 1), \
    Local[1] = StringChange(Local[0], ".", ""), \
    "[Files]\n" + \
    "Source: " + Source + "; DestDir: {app}" + ExtractFileDir(Dest) + \
        "; Components: " + Local[1] + "\n" + \
    "[Components]\n" + \
    "Name: " + Local[1] + "; Description: " + ExtractFileName(Dest) + "\n"

#define DirEntry(Source, Dest) \
    Local[0] = Copy(Dest, 2, Len(Dest) - 1), \
    Local[1] = StringChange(Local[0], ".", ""), \
    "[Components]\n" + \
    "Name: " + Local[1] + "; Description: " + ExtractFileName(Dest) + "\n"

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

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

#pragma parseroption -p+

#emit ProcessFolder("D:\SomeDirectory", "")

如果D:\SomeDirectory包含以下文件:

file1.txt
file2.txt
sub1\file11.txt
sub1\file12.txt
sub2\file21.txt
sub2\file22.txt

上面的代码将生成:

[Files]
Source: D:\SomeDirectory\file1.txt; DestDir: {app}; Components: file1txt
[Components]
Name: file1txt; Description: file1.txt
[Files]
Source: D:\SomeDirectory\file2.txt; DestDir: {app}; Components: file2txt
[Components]
Name: file2txt; Description: file2.txt
[Components]
Name: sub1; Description: sub1
[Files]
Source: D:\SomeDirectory\sub1\file11.txt; DestDir: {app}\sub1; Components: sub1\file11txt
[Components]
Name: sub1\file11txt; Description: file11.txt
[Files]
Source: D:\SomeDirectory\sub1\file12.txt; DestDir: {app}\sub1; Components: sub1\file12txt
[Components]
Name: sub1\file12txt; Description: file12.txt
[Components]
Name: sub2; Description: sub2
[Files]
Source: D:\SomeDirectory\sub2\file21.txt; DestDir: {app}\sub2; Components: sub2\file21txt
[Components]
Name: sub2\file21txt; Description: file21.txt
[Files]
Source: D:\SomeDirectory\sub2\file22.txt; DestDir: {app}\sub2; Components: sub2\file22txt
[Components]
Name: sub2\file22txt; Description: file22.txt

在安装程序中,您将获得:

在此处输入图片说明


但是请注意,可以通过这种方式处理的文件数受预处理程序堆栈的限制。

如果遇到这种情况,另一种(尽管很丑陋和复杂)的方法是使用用户定义的过程。有关使用此处显示的方法和用户定义的过程来实现递归文件处理的示例,请参见Inno Setup-递归子目录,而无需创建这些子目录

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Inno Setup查找子文件夹

Inno setup 只删除文件夹

Inno Setup:在“代码”部分递归复制文件夹,子文件夹和文件

在Inno Setup中将文件(依赖项)安装到安装文件夹的子文件夹(lib)中

Inno-setup将所有文件打包到一个文件夹中,每个文件只有1个文件

从Inno Setup从安装程序的文件夹中读取Delphi程序中的文件

Inno Setup:如果程序文件夹中存在文件,则关闭安装程序向导

如何强制Inno Setup动态设置安装文件夹

使用Inno Setup将Excel Addin文件夹添加到受信任位置

如何强制Inno Setup通过自定义向导页面中的信息动态设置安装文件夹?

有两个Inno Setup安装程序使用相同的{app}文件夹

在Inno Setup中有条件地包含文件夹

具有三个目标文件夹的Inno Setup

是否在“所有程序”列表中进行了其他安装的Inno安装程序子文件夹?

如何在Inno Setup中删除非空文件夹

从Inno Setup中的临时文件夹安装包含的安装程序

在Inno Setup中避免出现“无法展开shell文件夹常量userdocs失败”错误

文件夹的 Inno Setup 快捷方式未在 Windows 10 中打开

Inno Setup:在卸载过程中重新启动后删除文件夹

在 Inno Setup 创建页面中,用户可以从安装文件中打包的文件夹中选择文件

如何在 InitializeSetup 期间使用 inno setup 提取不同文件夹中的相同文件并将其粘贴到相应文件夹中

Inno Setup ReadReg运行时目标程序文件夹,将WAR文件添加到tomcat / webapps

检查Inno Setup内部临时文件夹中文件的存在

具有多个目标文件夹的Inno Setup自定义页面,其行为类似于普通文件夹选择页面

Inno Setup-防止桌面快捷方式打开子文件夹,而不是运行具有相同名称的可执行文件

Inno Setup在自定义文件夹选择页面上显示安装所需的空间

在TInputDirWizardPage上浏览文件夹时生成的Inno Setup事件?

Inno Setup:获取“不创建开始菜单文件夹”选项

Inno Setup-如何设置安装文件夹的权限