SFC(Simple Files Compressor)面向 Windows,输出自定义 .sy 格式。核心链路基于 C++ 实现文件头、目录块、数据块、Huffman 压缩与 AES 加密,外层补齐 Qt GUI 作为主要交互入口。项目从 CLI 原型演进为”核心归档链路 + GUI 前端 + 构建/文档维护”三层结构。
对象
工程分协议层、目录层、数据层、界面层。
协议层:FileLibrary、HeaderWriter、Locator——定义 .sy 文件头、策略号、版本信息与归档写入入口。目录与数据编解码层:EntryProcessor、BinaryStandardWriter、BinaryStandardLoader、EntryParser、DataLoader、DataExporter——扫描目录树、写入/读取目录块和数据块、条目解析与文件导出。算法与接口层:Heffman、HuffmanCompression、Aes、AesEncryption、ICompression、IEncryption——提供 Huffman/AES 能力并抽象调用接口。策略装配层:StrategyFactory、NullCompression、NullEncryption——组合四种模式并保持旧文件兼容。业务主链路:CompressionLoop、DecompressionLoop——串联压缩/解压流程。编码与路径适配层:EncodingUtils——统一 QString、UTF-8 与 std::filesystem::path 之间的转换。GUI 后台层:CompressionWorker——线程任务、进度回传、模式传参与策略自动探测。GUI 界面与启动层:MainWindow、main.cpp——界面布局、多语言加载、输入校验与任务触发。
.sy 协议固定为三段:19 字节文件头、目录块区域、数据块区域。目录块前置 Separated 标准,数据块按文件拆分,树数据和压缩数据各自带分块信息。
职责
HeaderWriter + Locator——文件头写入、目录偏移回填、compressedSize 回填、块边界维护。BinaryStandardLoader——目录块读取、解密和标准项装配。EntryParser——按 FlagType 解析目录项、文件项、逻辑根目录项和分割项。EntryProcessor——把输入路径转成目录树,BFS 序列化进目录块。
CompressionLoop——压缩主循环。DecompressionLoop——解压主循环。DataLoader——原始数据按 8MB 分块读取。DataExporter——树数据、压缩数据和分块标准写出,支持偏移量回填。StrategyFactory——按 CompressionMode 组装 HuffmanAES、HuffmanOnly、AESOnly、PackOnly。MainWindow + CompressionWorker——任务调度、进度回调、线程停止,不处理协议细节。
流程
归档流程:输入路径列表 → EntryProcessor → 挂到 LogicalRoot → BFS 写成目录项和文件项。目录块按 16KB 分块,每块前写 Separated(blockSize + IV)。目录块写完后 HeaderWriter 回填 directoryOffset,文件体写完后 Locator 回填 compressedSize。
解压流程:读文件头(strategy、version、directoryOffset)→ BinaryStandardLoader 逐块读取目录块,检查 IV 决定是否解密 → EntryParser 按 FlagType 拆成队列 → DecompressionLoop 先创建目录,再按 fileQueue 进入数据区。
数据流程:DataLoader 读原始数据块 → HuffmanCompression 生成频率表、Huffman 树和编码数据 → DataExporter 写树块、压缩块和有效位数。启用加密时再进 AesEncryption。树序列化用先序遍历(叶子 'l' + 字节值,内部节点 'r')。AES 密钥由 SHA-256 派生,协议层用 AES-128 CFB,目录块和数据块按流式长度组织,不引入 PKCS#7 填充。
路径流程:Qt 输入 → UTF-8 → 核心层 std::string → EncodingUtils::pathFromUtf8() → 文件系统。返回时走 EncodingUtils::pathToUtf8()。目录遍历、文件名序列化、解压输出目录拼接共用同一条转换链。
边界
- 协议层:
HeaderWriter+BinaryStandardLoader+EntryParser,文件头、目录块、数据区不依赖外部清单 - 目录层:
EntryProcessor+EntryParser,输入路径、逻辑根目录、BFS 队列、childCount和目录恢复停在这一层 - 数据层:
CompressionLoop+DecompressionLoop+ICompression+IEncryption,算法替换不改协议主流程 - 编码:
EncodingUtils统一处理,Qt、std::string、std::filesystem::path不脱离转换混用 - GUI:
MainWindow+CompressionWorker,界面层不接触目录块、文件头和数据区
性能
| 指标 | 数值 |
|---|---|
| 数据块大小 | 8MB |
| 目录缓冲 | 16KB |
| 内存峰值 | 约 100MB(Qt 引入后) |
| 最佳压缩率 | 约 60% |
| 测试场景 | 13,000 个文件/目录,230GB 数据 |
| 动态部署体积 | 57MB(exe + DLL + 插件) |
| 静态部署体积 | 16MB(单 exe) |
限制
当前版本以 Windows 为主,路径处理和文件系统行为按 Windows 规则组织。主流程仍是单线程顺序处理,ThreadPool 和 Scheduler 还停在接口和实验代码层。压缩算法当前只有 Huffman,AES 还是纯软件实现,长路径分支没有进入发布版本。
部分信息可能已经过时
粤公网安备44011102484817号