Inno setup inno安装更新文件存在于所有子目录中

Inno setup inno安装更新文件存在于所有子目录中,inno-setup,Inno Setup,我正在尝试创建一个安装程序来更新单个csv文件,该文件存在于不同的位置,具体取决于用户安装的应用程序。 我们的应用程序安装在程序文件中公司名称的文件夹中 因此,Company>App1、Company>App2、Company>App3等。当csv文件存在时,它直接位于App文件夹中 我试过: [Files] Source: "file.csv"; DestDir: "{pf}\Company\*"; 各种各样的标志和功能都没有用 flag: onlyifdestfileexists 跳过

我正在尝试创建一个安装程序来更新单个csv文件,该文件存在于不同的位置,具体取决于用户安装的应用程序。 我们的应用程序安装在程序文件中公司名称的文件夹中

因此,Company>App1、Company>App2、Company>App3等。当csv文件存在时,它直接位于App文件夹中

我试过:

[Files]
Source: "file.csv"; DestDir: "{pf}\Company\*"; 
各种各样的标志和功能都没有用

flag: onlyifdestfileexists
跳过所有内容,因为它不存在

Check: FileExists('file.csv')
什么都不做

Check: FileExistsWildcard('file.csv')
它使用FindFirst()调用一个函数,尝试创建一个名为*的新目录来安装该文件,而不是像这样覆盖找到该文件的目录中的文件

[Files]
Source: "file.csv"; DestDir: "{pf}\Company\"; Check: FileExistsWildcard('*\file.csv')

问题似乎与通配符*在与DestDir一起使用时不做任何事情有关。它只查找名为“*”的子文件夹,而不是搜索所有子文件夹。recursesubdirs标志当然适用于在源代码的子目录上迭代,但DestDir没有等效的标志

类似的通配符在
DestDir
中不受支持

如果您预先知道所有可能的子目录的名称(这可能是您自己的应用程序的情况),那么最简单的方法是包含多个
[文件]
条目,每个可能的应用程序一个条目。然后可以使用
onlyifdestfileexists
标志。请注意,当对多个条目使用相同的
源路径时,安装程序中只会存储文件的一个副本,因此不会膨胀到原来的大小


如果您的应用程序支持安装到不同的位置(大多数情况下都是这样),那么您需要稍微修改一下;不要硬编码
DestDir
,您需要让每个条目看起来像这样:

Source: file.csv; DestDir: {code:FindAppPath|App1}; Flags: onlyifdestfileexists
具有相应的
[code]
功能:

function FindAppPath(AppName: String): String;
在此函数中,使用
RegQueryStringValue
或其他方法查找正在搜索的应用程序的当前安装位置(通过
AppName
,它可以是您选择的任意字符串,也可以是正在查找的注册表路径的一部分;或者,如果方便的话,您可以为每个应用程序编写单独的函数)。如果未安装给定的应用程序,则返回
'
,由于
onlyifdestfileexists
标志,将跳过安装文件。请注意,每个应用程序仍需要一个条目,因此您需要提前知道可能安装的应用程序的最大数量

(如果不希望使用此标志,则跳过安装的另一种方法是定义
检查
功能,例如
检查:IsAppInstalled('App1')
检查:isapp1已安装


如果您不知道(或不想依赖于知道)预先安装的应用程序的最大可能数量,那么唯一的解决方案是退回到纯
[code]
。您需要一个
[Files]
条目,如下所示:

Source: file.csv; DestDir: {tmp}; AfterInstall: CopyToApplications
然后执行
CopyToApplications
过程,找到所有可能安装的路径(同样,可能通过
RegQueryStringValue
),然后针对每个安装:

FileCopy(ExpandConstant('{tmp}\file.csv'), AddBackslash(PathToApp) + 'file.csv');
您可能还希望查看CodeDlg示例脚本,并使用
CreateOutputProgressPage
在执行此过程时向用户提供反馈,但如果文件大小足够小,则可能不需要这样做



请注意,在所有情况下,您可能都希望禁用卸载支持(因为每个应用程序都有自己的独立卸载程序来处理);请确保在
[Setup]
部分中有
Uninstallable=no

谢谢。请在[Files]中使用单独的条目部分是我得出的结论。我希望这只是一个解决办法,直到我发现了一些“魔力”用于迭代目标子文件夹。我使用了onlyfdestfileexists标志,并将其设置为“无卸载程序”,但没有任何设置,以防用户更改安装位置。我肯定会返回并执行此操作,感谢有关实现此功能的提示。