Inno Setup 打包:包含子目录 / 不包含子目录 完整写法

编程开发 wasee 8 days ago (2026年6月17日) 25 views

核心区分:recursesubdirs标志控制是否递归子文件夹


一、关键标志说明

  1. recursesubdirs
    开启:递归遍历所有子目录,把子文件夹内文件一并打包、保留目录结构
    关闭(默认):只复制当前层级文件,忽略所有子文件夹
  2. createallsubdirs(配合 recursesubdirs 使用)
    强制创建空的子目录;不加则只会生成有文件的文件夹jrsoftware.org
  3. ignoreversion:通用,忽略文件版本、强制覆盖

二、1. 包含全部子目录(递归复制,保留目录结构)

示例 1:打包整个目录(含所有子文件夹)

iss
[Files] ; 源目录下所有文件+所有子目录,完整复制到安装目录{app} Source: "app_src\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
  • recursesubdirs:读取所有子文件夹文件
  • createallsubdirs:安装时原样创建所有子文件夹(含空文件夹)

示例 2:单独打包资源文件夹(带子目录)

iss
; 源res文件夹及内部所有子目录,释放到{app}\res Source: "res\*"; DestDir: "{app}\res"; Flags: ignoreversion recursesubdirs createallsubdirs

三、2. 不包含子目录(仅复制当前层级文件,忽略子文件夹)

不要加 recursesubdirs,默认只取一级文件

示例 1:只复制根目录所有文件,跳过子文件夹

iss
[Files] ; 仅 app_src 根目录文件,子文件夹全部忽略 Source: "app_src\*"; DestDir: "{app}"; Flags: ignoreversion

示例 2:只复制指定后缀一级文件(不进子目录)

iss
; 仅根目录exe、dll,子文件夹里的exe/dll不会打包 Source: "bin\*.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "bin\*.dll"; DestDir: "{app}"; Flags: ignoreversion

四、混合场景:部分文件夹递归、部分只取一级

iss
[Files] ; 1. 主程序根目录文件,不包含子文件夹 Source: "publish\*.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "publish\*.json"; DestDir: "{app}"; Flags: ignoreversion ; 2. 资源文件夹需要完整子目录结构 Source: "publish\static\*"; DestDir: "{app}\static"; Flags: ignoreversion recursesubdirs createallsubdirs

五、常见踩坑

  1. 只写Source: “folder”(不带\*)
    只会复制文件夹本身,不会复制里面任何文件,必须加\*
  2. 只用 recursesubdirs 不加 createallsubdirs
    空的子目录安装后不会生成,只有带文件的文件夹才创建
  3. 想只复制一级,但误加 recursesubdirs
    会把深层所有文件全部释放,目录层级错乱

六、最简对比模板

iss


[Files] Source: "src\*"; DestDir: "{app}"; Flags: ignoreversion Source: "src\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs