这是一个面向 Windows 的图形化多层压缩包自动识别与递归解压工具。程序使用 CustomTkinter 构建夜间模式界面,通过本机已安装的 7-Zip、Bandizip 或 WinRAR/UnRAR 完成实际解压。
它适合处理以下情况:
- ZIP、7Z、RAR 等压缩包多层嵌套;
.7z.001、.zip.001、.part01.rar、.r00、.z01等分卷;- 压缩内容被伪装成
.mp4或其他扩展名; - 不同递归层使用不同密码;
- 希望把一次成功解压过程保存为可复用模式。
- 拖入文件或通过按钮选择文件。
- 自动识别源文件真实类型、分卷关系和可用解压引擎。
- 按层递归处理标准压缩文件,直到不再发现下一层压缩包。
- 使用快速目录读取后直接解压,不默认执行耗时的完整性测试。
- 以正式解压结果区分密码错误、分卷缺失、CRC错误、数据损坏和不支持格式。
- 支持取消任务,并终止正在运行的外部解压进程。
- 用户最初选择的
.mp4允许检测附加或伪装的压缩内容。 - 优先把原始路径交给解压引擎快速读取。
- 引擎不能直接识别时,在任务临时目录创建
.zip别名:优先使用NTFS硬链接,失败后才复制。 - 不修改、不重命名用户的原始MP4。
- 第2层出现单个MP4时,由用户选择继续检测或直接作为最终文件输出。
- 第3层及以后的视频和音频文件直接视为最终媒体文件,不再扫描内部压缩魔数。
支持直接输出的媒体扩展名包括:
.mp4 .mkv .avi .mov .wmv .flv .webm .m4v
.ts .m2ts .mp3 .flac .wav .m4a .aac
程序可识别并归组:
.7z.001 / .7z.002
.zip.001 / .zip.002
.zip / .z01 / .z02
.part1.rar / .part01.rar
.rar / .r00 / .r01
.001 / .002
拖入非首卷时,程序会尝试定位首卷并检查中间分卷是否缺失。
- 当前任务可临时添加多个候选密码。
- 模式中可以保存通用密码和按层密码。
- 候选密码可添加、删除、调整顺序及显示或隐藏。
- 模式密码按当前设计以明文保存,适用于普通资源压缩密码。
- 日志、错误信息和任务报告不会写入明文密码或完整密码参数。
模式可以保存:
- 文件名匹配规则;
- 文件扩展名;
- 正则表达式;
- 解压引擎顺序;
- 通用密码和按层密码;
- 最大递归深度;
- 多压缩包策略;
- MP4特殊检测和临时别名设置;
- 输出方式及原文件处理方式。
“文件名包含”可切换为正则表达式匹配。保存前会验证正则是否合法。
未匹配任何已有模式的任务成功完成后,程序可以询问是否生成模式草稿。
草稿会根据本次实际记录推导:
- 源文件名和扩展名;
- 精确、纯数字或“固定前缀+数字”匹配规则;
- 实际解压层数;
- 每层压缩格式、分卷和成功引擎;
- 实际成功使用的密码;
- MP4特殊识别和临时别名情况;
- 多压缩包、输出及覆盖策略。
程序只生成草稿,不会未经确认自动保存。保存前还会检查相同规则、同名模式、扩展名重叠和过宽正则。
可在“引擎设置”中关闭:
任务成功后提示保存未匹配模式
自动打开模式草稿编辑器
- Windows 10或Windows 11;
- Python 3.12或更高版本;
- 至少安装一个解压引擎:
- 7-Zip,推荐;
- Bandizip;
- WinRAR或UnRAR。
外部解压软件不会随本项目一起安装。程序会检测常见安装位置,也可以在“引擎设置”中手动指定程序路径和优先级。
直接双击项目根目录中的:
run.bat
首次启动时,脚本会:
- 检查项目目录中的
.venv; - 如有需要,创建Python虚拟环境;
- 检查并安装
requirements.txt中的依赖; - 启动图形界面。
也可以手动启动:
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\pythonw.exe app.py- 将压缩文件、分卷或伪装文件拖入窗口,也可以点击“选择文件”。
- 等待程序显示文件大小、扩展名、真实格式、分卷和匹配模式。
- 如有需要,添加当前任务候选密码。
- 设置输出方式、同名策略、递归层数和原文件处理方式。
- 点击醒目的“一键解压”按钮。
- 在层级任务树和日志区域查看处理进度。
- 成功后点击“打开输出目录”。
- 标准压缩后缀按普通压缩包快速读取并解压。
- MP4允许进行伪装或附加压缩内容识别。
- 非标准扩展名可以通过文件头和源文件特殊检测识别。
- 标准压缩后缀和分卷继续自动递归。
- 单个MP4会暂停后台任务,并在主线程询问继续检测还是直接输出。
- 非标准普通文件默认作为最终文件。
- 标准压缩后缀继续递归。
- 媒体文件直接输出,不读取内部压缩特征。
- 其他普通文件作为最终结果保留。
ask:发现多个候选压缩包时停止递归并导出当前层。all:处理本层全部压缩包,并分别保存结果。largest:只继续处理体积最大的压缩包。stop:不再递归,直接导出当前层。
输出方式:
dedicated_folder:在指定位置创建独立输出目录;source_root:直接输出到源文件所在目录;custom:输出到用户选择的目录。
同名处理策略:
- 自动重命名;
- 覆盖;
- 跳过;
- 要求用户处理。
原文件可以:
- 保留;
- 移入回收站;
- 永久删除。
永久删除必须在界面中再次确认,并且只会在最终文件成功导出后执行。失败或取消任务不会删除原文件。
- 解压前验证归档成员路径,拒绝
..、绝对路径和UNC路径。 - 解压后检查符号链接、重解析点和越界输出。
- 限制单文件大小、累计大小、文件数量、临时目录大小和压缩比。
- 通过文件指纹防止异常重复递归。
- 不执行解压得到的程序、脚本或动态链接库。
- 日志命令行参数会对密码进行脱敏。
- Bandizip输出采用有界缓存,避免大量进度文本占用过多内存。
程序使用固定夜间模式:
- 主窗口、任务树、模式编辑器、草稿页和引擎设置统一为深色;
- 层级任务树使用深色表头、行和选中状态;
- 任务树滚动条与其他CustomTkinter滚动条保持一致;
- “一键解压”按钮使用更大的尺寸和醒目的主色。
Windows原生文件选择框和消息提示框的颜色由Windows系统主题决定。
项目中的默认配置:
config\default_config.json
config\default_profiles.json
程序实际运行时使用的配置:
%APPDATA%\NestedArchiveExtractor\config.json
%APPDATA%\NestedArchiveExtractor\profiles.json
日志和任务报告:
%LOCALAPPDATA%\NestedArchiveExtractor\logs\
任务临时目录:
%LOCALAPPDATA%\NestedArchiveExtractor\temp\<job_id>\
成功保存模式时会先生成 profiles.json.bak备份。任务临时目录在成功、取消或普通失败后按设置自动清理。
NestedArchiveExtractor\
├─ app.py 程序入口
├─ run.bat Windows一键启动脚本
├─ requirements.txt Python运行依赖
├─ README.md 中文说明文档
├─ config\
│ ├─ default_config.json 默认全局配置
│ └─ default_profiles.json 默认模式模板
└─ src\
├─ core\ 检测、递归、任务、配置、输出和模式建议
├─ engines\ 7-Zip、Bandizip和WinRAR适配器
├─ gui\ 主窗口、夜间主题、模式和设置界面
├─ models\ 任务、轨迹和引擎结果模型
└─ utils\ 日志、进程、路径、哈希及Windows安全工具
普通文件头识别通常很快;如果开启源文件内部压缩数据扫描,大文件可能需要顺序读取更多内容,因此耗时会增加。
程序可能正在尝试不同的候选密码或备用解压引擎。日志不会显示密码明文。
程序会按照引擎顺序逐个尝试。某些带附加压缩内容的媒体文件只会被特定引擎直接识别。
项目内配置是默认模板;用户实际配置保存在 %APPDATA%\NestedArchiveExtractor,避免升级或替换项目文件时覆盖个人设置。
当前模式密码按明文保存在 profiles.json。它们不会写入日志和任务报告,请不要保存重要账户密码。
- 优先安装并配置7-Zip,同时保留Bandizip作为备用引擎。
- 大文件处理前确认输出磁盘和临时目录所在磁盘有足够空间。
- 不确定时保持“保留原文件”和“自动重命名”策略。
- 只对可信来源文件使用永久删除选项。