Inno Setup:为文件夹及其子文件夹中的所有文件动态添加组件 [英] Inno Setup: Dynamically add a component for all files in a folder and its subfolders

查看:888
本文介绍了Inno Setup:为文件夹及其子文件夹中的所有文件动态添加组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我想创建一个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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆