Inno Setup:为文件夹及其子文件夹中的所有文件动态添加组件 [英] Inno Setup: Dynamically add a component for all files in a folder and its subfolders
问题描述
我想创建一个Inno Setup文件,它将抓取用户可以放在其中的文件夹中的文件,而不必每次修改Inno Setup文件新文件被添加。同时,我需要安装文件的用户能够选择要复制的文件。
如果我这样做:
来源:D :\SomeDirectory\ *; DestDir:{app}; \
标志:ignoreversion recursesubdirs createallsubdirs;组件:dll
自定义安装程序仅显示复制或不复制整个文件夹的选项。假设文件在编译时可用,你可以使用
你可以用这种方式处理被预处理器堆栈所限制。
如果您碰到这种情况,另一个(虽然很丑但很复杂)的方法是使用用户定义的过程。有关使用此处显示的方法和使用用户定义的过程来实现递归文件处理的示例,请参见 Inno Setup-递归子目录,而不创建同样的子目录。
Inno Setup: Dynamically add all files in a folder and add a component tag, so during running of the setup the user can select custom setup and select which files to copy.
I'd like to create a Inno Setup file that will grab files in a folder that users can put in there, without having to modify the Inno Setup file each time a new file is added. At the same time, I need the user of the setup file to be able to select which files to copy.
If I do something like this:
Source: "D:\SomeDirectory\*"; DestDir: "{app}"; \
Flags: ignoreversion recursesubdirs createallsubdirs; Components: dlls
The custom setup only shows the option to copy or not to copy the entire folder.
Assuming the files are available on compile time, you can use Inno Setup Preprocessor recursive macro to generate the [Files]
and [Components]
sections.
This code is partially based on Generating Inno Setup file flags programmatically.
#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", "")
If D:\SomeDirectory
contains these files:
file1.txt
file2.txt
sub1\file11.txt
sub1\file12.txt
sub2\file21.txt
sub2\file22.txt
The above code will generate:
[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
In installer, you will get:
Though note that number of files you can process this way is limited by preprocessor stack.
If you get hit by that, the other (though ugly and complex) way is to use user defined procedures. For an example of implementing a recursive files processing both using approach shown here and using user defined procedures, see Inno Setup - Recurse sub directories without creating those same sub directories.
这篇关于Inno Setup:为文件夹及其子文件夹中的所有文件动态添加组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!