1019 字
5 分钟
SFC:基于自定义 .sy 格式的文件归档工具

项目仓库: Gitee | GitHub

SFC(Simple Files Compressor)面向 Windows,输出自定义 .sy 格式。核心链路基于 C++ 实现文件头、目录块、数据块、Huffman 压缩与 AES 加密,外层补齐 Qt GUI 作为主要交互入口。项目从 CLI 原型演进为”核心归档链路 + GUI 前端 + 构建/文档维护”三层结构。

对象#

工程分协议层、目录层、数据层、界面层。

协议层:FileLibraryHeaderWriterLocator——定义 .sy 文件头、策略号、版本信息与归档写入入口。目录与数据编解码层:EntryProcessorBinaryStandardWriterBinaryStandardLoaderEntryParserDataLoaderDataExporter——扫描目录树、写入/读取目录块和数据块、条目解析与文件导出。算法与接口层:HeffmanHuffmanCompressionAesAesEncryptionICompressionIEncryption——提供 Huffman/AES 能力并抽象调用接口。策略装配层:StrategyFactoryNullCompressionNullEncryption——组合四种模式并保持旧文件兼容。业务主链路:CompressionLoopDecompressionLoop——串联压缩/解压流程。编码与路径适配层:EncodingUtils——统一 QString、UTF-8 与 std::filesystem::path 之间的转换。GUI 后台层:CompressionWorker——线程任务、进度回传、模式传参与策略自动探测。GUI 界面与启动层:MainWindowmain.cpp——界面布局、多语言加载、输入校验与任务触发。

.sy 协议固定为三段:19 字节文件头、目录块区域、数据块区域。目录块前置 Separated 标准,数据块按文件拆分,树数据和压缩数据各自带分块信息。

职责#

HeaderWriter + Locator——文件头写入、目录偏移回填、compressedSize 回填、块边界维护。BinaryStandardLoader——目录块读取、解密和标准项装配。EntryParser——按 FlagType 解析目录项、文件项、逻辑根目录项和分割项。EntryProcessor——把输入路径转成目录树,BFS 序列化进目录块。

CompressionLoop——压缩主循环。DecompressionLoop——解压主循环。DataLoader——原始数据按 8MB 分块读取。DataExporter——树数据、压缩数据和分块标准写出,支持偏移量回填。StrategyFactory——按 CompressionMode 组装 HuffmanAESHuffmanOnlyAESOnlyPackOnlyMainWindow + CompressionWorker——任务调度、进度回调、线程停止,不处理协议细节。

流程#

归档流程:输入路径列表 → EntryProcessor → 挂到 LogicalRoot → BFS 写成目录项和文件项。目录块按 16KB 分块,每块前写 SeparatedblockSize + IV)。目录块写完后 HeaderWriter 回填 directoryOffset,文件体写完后 Locator 回填 compressedSize

解压流程:读文件头(strategyversiondirectoryOffset)→ BinaryStandardLoader 逐块读取目录块,检查 IV 决定是否解密 → EntryParserFlagType 拆成队列 → DecompressionLoop 先创建目录,再按 fileQueue 进入数据区。

数据流程DataLoader 读原始数据块 → HuffmanCompression 生成频率表、Huffman 树和编码数据 → DataExporter 写树块、压缩块和有效位数。启用加密时再进 AesEncryption。树序列化用先序遍历(叶子 'l' + 字节值,内部节点 'r')。AES 密钥由 SHA-256 派生,协议层用 AES-128 CFB,目录块和数据块按流式长度组织,不引入 PKCS#7 填充。

路径流程:Qt 输入 → UTF-8 → 核心层 std::stringEncodingUtils::pathFromUtf8() → 文件系统。返回时走 EncodingUtils::pathToUtf8()。目录遍历、文件名序列化、解压输出目录拼接共用同一条转换链。

边界#

  • 协议层HeaderWriter + BinaryStandardLoader + EntryParser,文件头、目录块、数据区不依赖外部清单
  • 目录层EntryProcessor + EntryParser,输入路径、逻辑根目录、BFS 队列、childCount 和目录恢复停在这一层
  • 数据层CompressionLoop + DecompressionLoop + ICompression + IEncryption,算法替换不改协议主流程
  • 编码EncodingUtils 统一处理,Qt、std::stringstd::filesystem::path 不脱离转换混用
  • GUIMainWindow + CompressionWorker,界面层不接触目录块、文件头和数据区

性能#

指标数值
数据块大小8MB
目录缓冲16KB
内存峰值约 100MB(Qt 引入后)
最佳压缩率约 60%
测试场景13,000 个文件/目录,230GB 数据
动态部署体积57MB(exe + DLL + 插件)
静态部署体积16MB(单 exe)

限制#

当前版本以 Windows 为主,路径处理和文件系统行为按 Windows 规则组织。主流程仍是单线程顺序处理,ThreadPoolScheduler 还停在接口和实验代码层。压缩算法当前只有 Huffman,AES 还是纯软件实现,长路径分支没有进入发布版本。


开发日志:SFC

SFC:基于自定义 .sy 格式的文件归档工具
https://www.yonagi.world/posts/sfc-project-intro/
作者
YONAGI
发布于
2026-06-02
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
遠い日に想いを馳せて
Laplacian
封面
遠い日に想いを馳せて
Laplacian
0:00 / 0:00