Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

多层嵌套压缩包一键解压工具

这是一个面向 Windows 的图形化多层压缩包自动识别与递归解压工具。程序使用 CustomTkinter 构建夜间模式界面,通过本机已安装的 7-Zip、Bandizip 或 WinRAR/UnRAR 完成实际解压。

它适合处理以下情况:

  • ZIP、7Z、RAR 等压缩包多层嵌套;
  • .7z.001.zip.001.part01.rar.r00.z01 等分卷;
  • 压缩内容被伪装成 .mp4 或其他扩展名;
  • 不同递归层使用不同密码;
  • 希望把一次成功解压过程保存为可复用模式。

主要功能

一键递归解压

  • 拖入文件或通过按钮选择文件。
  • 自动识别源文件真实类型、分卷关系和可用解压引擎。
  • 按层递归处理标准压缩文件,直到不再发现下一层压缩包。
  • 使用快速目录读取后直接解压,不默认执行耗时的完整性测试。
  • 以正式解压结果区分密码错误、分卷缺失、CRC错误、数据损坏和不支持格式。
  • 支持取消任务,并终止正在运行的外部解压进程。

MP4与媒体文件处理

  • 用户最初选择的 .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

首次启动时,脚本会:

  1. 检查项目目录中的 .venv
  2. 如有需要,创建Python虚拟环境;
  3. 检查并安装 requirements.txt中的依赖;
  4. 启动图形界面。

也可以手动启动:

py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\pythonw.exe app.py

基本使用步骤

  1. 将压缩文件、分卷或伪装文件拖入窗口,也可以点击“选择文件”。
  2. 等待程序显示文件大小、扩展名、真实格式、分卷和匹配模式。
  3. 如有需要,添加当前任务候选密码。
  4. 设置输出方式、同名策略、递归层数和原文件处理方式。
  5. 点击醒目的“一键解压”按钮。
  6. 在层级任务树和日志区域查看处理进度。
  7. 成功后点击“打开输出目录”。

层级处理规则

第1层:用户选择的源文件

  • 标准压缩后缀按普通压缩包快速读取并解压。
  • MP4允许进行伪装或附加压缩内容识别。
  • 非标准扩展名可以通过文件头和源文件特殊检测识别。

第2层

  • 标准压缩后缀和分卷继续自动递归。
  • 单个MP4会暂停后台任务,并在主线程询问继续检测还是直接输出。
  • 非标准普通文件默认作为最终文件。

第3层及以后

  • 标准压缩后缀继续递归。
  • 媒体文件直接输出,不读取内部压缩特征。
  • 其他普通文件作为最终结果保留。

多压缩包策略

  • 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安全工具

常见问题

拖入文件后检测时间为什么不同?

普通文件头识别通常很快;如果开启源文件内部压缩数据扫描,大文件可能需要顺序读取更多内容,因此耗时会增加。

为什么同一个快速读取日志出现多次?

程序可能正在尝试不同的候选密码或备用解压引擎。日志不会显示密码明文。

为什么源MP4先由7-Zip失败,随后Bandizip成功?

程序会按照引擎顺序逐个尝试。某些带附加压缩内容的媒体文件只会被特定引擎直接识别。

为什么配置不在项目目录?

项目内配置是默认模板;用户实际配置保存在 %APPDATA%\NestedArchiveExtractor,避免升级或替换项目文件时覆盖个人设置。

模式密码是否加密?

当前模式密码按明文保存在 profiles.json。它们不会写入日志和任务报告,请不要保存重要账户密码。

使用建议

  • 优先安装并配置7-Zip,同时保留Bandizip作为备用引擎。
  • 大文件处理前确认输出磁盘和临时目录所在磁盘有足够空间。
  • 不确定时保持“保留原文件”和“自动重命名”策略。
  • 只对可信来源文件使用永久删除选项。

About

Windows GUI tool for recursively extracting nested and multi-volume archives.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages