如何基于包含文件自动计算Inno Setup组件所需磁盘空间
动态计算Inno Setup组件的ExtraDiskSpaceRequired值
问题场景
现有Inno Setup配置片段如下:
[Files] Source: Src\MyApp\*.*; DestDir: {app}; \ Flags: overwritereadonly ignoreversion recursesubdirs createallsubdirs; [Components] Name: "MyApp"; Description: "MyDescription"; Types: full custom; Flags: fixed; \ ExtraDiskSpaceRequired: 384827392;
当Src\MyApp目录下的文件发生增减或大小变化时,需要手动修改ExtraDiskSpaceRequired的数值,希望通过FileSize/FileSize64函数实现该值的动态计算。
实现方案
Inno Setup的预处理阶段支持文件操作函数,可在编译时自动计算目标目录下所有文件的总大小,将结果赋值给常量后,直接在组件配置中引用即可。
步骤1:添加预处理计算代码
在脚本最顶部([Setup]段之前)插入以下预处理代码,递归遍历Src\MyApp下的所有文件并累加总大小:
; 初始化总大小为0 #define MyAppTotalSize 0 ; 遍历根目录下的文件 #for /f "files" %%f in "Src\MyApp\*.*" do \ #define MyAppTotalSize MyAppTotalSize + FileSize(%%f) ; 递归遍历所有子目录下的文件 #for /r "Src\MyApp" %%f in "*.*" do \ #define MyAppTotalSize MyAppTotalSize + FileSize(%%f)
步骤2:修改Components段配置
将ExtraDiskSpaceRequired的值替换为预处理阶段定义的MyAppTotalSize常量:
[Components] Name: "MyApp"; Description: "MyDescription"; Types: full custom; Flags: fixed; \ ExtraDiskSpaceRequired: {#MyAppTotalSize};
适配大文件场景
如果Src\MyApp下的文件总大小超过2GB,改用FileSize64函数避免数值溢出,预处理代码调整为:
#define MyAppTotalSize 0 #for /f "files" %%f in "Src\MyApp\*.*" do \ #define MyAppTotalSize MyAppTotalSize + FileSize64(%%f) #for /r "Src\MyApp" %%f in "*.*" do \ #define MyAppTotalSize MyAppTotalSize + FileSize64(%%f)
说明
- 上述计算是在编译安装包时完成的,每次编译都会自动重新扫描文件并计算最新总大小,无需手动修改数值。
- 预处理阶段的文件路径是相对于Inno Setup脚本所在目录的相对路径,请确保路径正确。
内容的提问来源于stack exchange,提问作者pburgr
相关产品推荐
相关产品推荐

