使用 Inno Setup 打包和处理单个大文件

在软件开发和分发过程中,尤其是涉及到大文件(如模型文件、数据文件等)的场景,如何高效地打包和处理这些文件是一个常见的问题。本文将介绍如何使用 Inno Setup 打包单个大文件,并在安装过程中对其进行处理(如合并分块文件)。


为什么需要分块和合并大文件?

在某些情况下,单个大文件可能需要被拆分成多个小文件进行分发,例如:

  • 文件大小限制:某些文件系统或传输协议对单个文件的大小有限制。
  • 压缩优化:分块文件可以更好地利用压缩算法的优势。
  • 安装灵活性:分块文件可以按需加载或合并,减少安装包的复杂性。

通过 Inno Setup,我们可以轻松实现以下功能:

  1. 将分块文件打包到安装包中。
  2. 在安装过程中自动合并分块文件为原始大文件。
  3. 安装完成后清理分块文件,保持安装目录整洁。

准备工作

1. 拆分大文件

在打包之前,我们需要将大文件拆分为多个分块文件。以下是一个 Python 脚本,用于将大文件拆分为指定大小的分块文件。

Python 拆分脚本

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import os  
import sys

def split_file(source_file, destination_folder, chunk_size_mb):
if not os.path.exists(source_file):
print(f"源文件不存在: {source_file}")
sys.exit(1)

if not os.path.exists(destination_folder):
os.makedirs(destination_folder)

chunk_size = chunk_size_mb * 1024 * 1024 # 转换为字节
index = 0

print(f"开始拆分文件: {source_file}")
with open(source_file, 'rb') as f:
while chunk := f.read(chunk_size):
chunk_file = os.path.join(destination_folder, f"part_{index:03d}.dat")
with open(chunk_file, 'wb') as chunk_f:
chunk_f.write(chunk)
print(f"生成分块文件: {chunk_file}")
index += 1

print(f"文件拆分完成,存放在 {destination_folder}")

if __name__ == "__main__":
if len(sys.argv) < 4:
print("用法: python split.py <源文件路径> <目标目录> <分块大小MB>")
sys.exit(1)

source_file = sys.argv[1]
destination_folder = sys.argv[2]
chunk_size_mb = int(sys.argv[3])

split_file(source_file, destination_folder, chunk_size_mb)

使用方法

  1. 将上述代码保存为 split.py

  2. 在命令行中运行以下命令:

    bash
    1
    python split.py <源文件路径> <目标目录> <分块大小MB>  

    例如:

    bash
    1
    python split.py "large_file.dat" "output_folder" 100  
    • large_file.dat 是需要拆分的大文件路径。
    • output_folder 是存放分块文件的目标目录。
    • 100 表示每个分块文件的大小为 100MB。
  3. 运行结果: 假设源文件为 large_file.dat,目标目录为 output_folder,拆分后会生成以下文件:

    python
    1
    2
    3
    4
    output_folder\part_000.dat  
    output_folder\part_001.dat
    output_folder\part_002.dat
    ...

2. 使用 Inno Setup 打包分块文件

Inno Setup 脚本实现

以下是完整的 Inno Setup 脚本,包含文件打包、安装时合并分块文件、以及清理分块文件的逻辑。

完整脚本

plaintext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[Setup]  
AppName=SoftWare
AppVersion=1.0
WizardStyle=modern
DefaultDirName={autopf}\软件安装路径
DefaultGroupName=SoftWare
UninstallDisplayIcon={app}\可执行程序.exe
Compression=lzma2
SolidCompression=yes
ChangesAssociations=yes
UserInfoPage=yes
PrivilegesRequired=admin

; 定义安装文件
[Files]
Source: "程序路径\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs

; 定义快捷方式
[Icons]
Name: "{userdesktop}\SoftWare"; Filename: "{app}\可执行程序.exe"; WorkingDir: "{app}"; IconFilename: "{app}\可执行程序.exe"
Name: "{group}\SoftWare"; Filename: "{app}\可执行程序.exe"; WorkingDir: "{app}"; IconFilename: "{app}\可执行程序.exe"

; 定义卸载时需要删除的文件
[UninstallDelete]
Type: filesandordirs; Name: "{app}"

; 定义安装任务
[Tasks]
Name: "desktopicon"; Description: "创建桌面快捷方式"; GroupDescription: "附加任务"; Flags: unchecked

; 自定义安装界面(可选,显示欢迎信息)
[Messages]
WelcomeLabel1=欢迎使用SoftWare V1.0 安装程序!
WelcomeLabel2=此向导将引导您完成安装。

; 安装完成后运行的命令
[Run]
; 合并 big 文件
Filename: "cmd.exe"; Parameters: "/c copy /b ""{app}\part_000.dat""+""{app}\part_001.dat""+""{app}\part_002.dat""+""{app}\part_003.dat"" ""{app}\big.dat"""; Flags: runhidden
; 删除 big 的分块文件
Filename: "cmd.exe"; Parameters: "/c del ""{app}\part_000.dat"" ""{app}\part_001.dat"" ""{app}\part_002.dat"" ""{app}\part_003.dat"""; Flags: runhidden


脚本解析

1. 文件部分 [Files]

plaintext
1
2
[Files]  
Source: "程序路径\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs
  • 程序路径\ 目录下的所有文件(包括分块文件)复制到安装目录 {app}
  • 使用 Flags: recursesubdirs createallsubdirs 确保子目录结构被保留。

2. 合并分块文件 [Run]

合并 Big文件

plaintext
1
Filename: "cmd.exe"; Parameters: "/c copy /b ""{app}\part_000.dat""+""{app}\part_001.dat""+""{app}\part_002.dat""+""{app}\part_003.dat"" ""{app}\big.dat"""; Flags: runhidden  
  • 使用 cmd.exe 执行 copy /b 命令,将 part_*.dat 文件合并为 big.dat
  • /b 表示以二进制模式合并文件,确保文件内容不被破坏。
  • Flags: runhidden 隐藏命令提示符窗口,避免用户看到合并过程。

删除分块文件

plaintext
1
Filename: "cmd.exe"; Parameters: "/c del ""{app}\part_000.dat"" ""{app}\part_001.dat"" ""{app}\part_002.dat"" ""{app}\part_003.dat"""; Flags: runhidden  
  • 使用 cmd.exe 执行 del 命令删除分块文件,保持安装目录整洁。

3. 快捷方式 [Icons]

plaintext
1
2
[Icons]  
Name: "{userdesktop}\SoftWare"; Filename: "{app}\可执行程序.exe"; WorkingDir: "{app}"; IconFilename: "{app}\可执行程序.exe"
  • 在桌面和开始菜单中创建快捷方式,方便用户快速启动程序。

运行结果

  1. 安装完成后
    • big.dat 文件会出现在安装目录中。
    • 分块文件(如 part_000.dat)会被删除。

总结

通过 Inno Setup,我们可以轻松实现大文件的分块打包和安装时的自动合并。本文的脚本展示了如何:

  1. 将分块文件打包到安装包中。
  2. 在安装完成后自动合并分块文件为原始大文件。
  3. 清理分块文件,保持安装目录整洁。

这种方法适用于需要分发大文件的软件项目,既能优化安装包大小,又能提升用户体验。如果你有类似需求,可以参考本文的脚本并根据实际情况进行调整。

该封面图片由Wolfgang WeiserPixabay上发布