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

项目仓库: Gitee | GitHub

SFC(Simple Files Compressor)面向 Windows,输出格式为自定义 .sy。项目围绕归档协议、目录块写入、偏移量维护、路径编码转换和压缩加密组合展开。CLI 与 Qt GUI 共用核心层,界面层负责参数、进度和线程调度。

对象#

工程对象分成协议层、目录层、数据层、界面层。协议层由 HeaderWriterLocatorBinaryStandardLoaderEntryParser 组成,核心字段包括 strategyversiondirectoryOffsetcompressedSize。目录层由 EntryProcessorLogicalRootDirectoryFileSeparatedSymbolLink 组成,负责目录树和目录块。数据层由 CompressionLoopDecompressionLoopDataLoaderDataExporterStrategyFactoryICompressionIEncryption 组成,覆盖 Huffman、AES 和数据块读写。界面层由 MainWindowCompressionWorkerQThread 组成,负责输入路径、模式、密码、进度和停止控制。

.sy 协议对象固定为三段:19 字节文件头、目录块区域、数据块区域。目录块前置 Separated 标准,数据块按文件拆分,树数据和压缩数据各自带分块信息。路径对象统一经过 EncodingUtils::pathFromUtf8()EncodingUtils::pathToUtf8()path.u8string()

职责#

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

CompressionLoop 负责压缩主循环,DecompressionLoop 负责解压主循环,DataLoader 负责原始数据读取,DataExporter 负责树数据、压缩数据和分块标准写出。StrategyFactoryCompressionMode 组装 HuffmanAESHuffmanOnlyAESOnlyPackOnlyMainWindowCompressionWorker 只负责任务调度、进度回调和线程停止,不处理协议细节。

流程#

归档流程从输入路径列表进入 EntryProcessor。输入源先挂到 LogicalRoot,再按 BFS 顺序写成目录项和文件项。目录块按 16KB 分块,每块前写入 Separated 标准,块内记录 blockSize 和 AES-CFB 的 IV。目录块写完后,HeaderWriter 回填 directoryOffset,文件体写完后,Locator 回填 compressedSize

解压流程从文件头开始。读取 strategyversiondirectoryOffset 后,BinaryStandardLoader 逐块读取目录块,检查 IV,决定是否解密,再把二进制数据交给 EntryParserEntryParserDirectoryFileLogicalRootSeparatedSymbolLink 拆成 directoryQueueReadyentryQueuefileQueueDecompressionLoop 先创建目录,再按 fileQueue 进入数据区读取文件体。

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

路径流程贯穿 GUI、核心层和文件系统。Qt 输入先转成 UTF-8,核心层用 std::string 表示 UTF-8 文本,进入文件系统前统一走 EncodingUtils::pathFromUtf8(),返回日志或界面前统一走 EncodingUtils::pathToUtf8()。目录遍历、文件名序列化、解压输出目录拼接都沿用同一条转换链。

.sy 文件头、目录块和数据块。格式识别依赖 magicNum_1magicNum_2,模式识别依赖 strategy,目录读取依赖 directoryOffset,数据读取依赖 compressedSizeblockSize。目录块、数据块、IV、偏移量都写进归档内部,不依赖外部清单。

目录 EntryProcessorBinaryStandardLoaderEntryParser。输入路径、逻辑根目录、BFS 队列、childCount 和目录恢复都停在这一层。压缩:CompressionLoopDecompressionLoopICompressionIEncryption,算法替换不改协议主流程。编码问题用: EncodingUtils,并且Qt、std::stringstd::filesystem::path 不应当脱离转换混用。GUI 部分有 MainWindowCompressionWorker,界面层不接触目录块、文件头和数据区。

限制#

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


开发日志(一):AES 原型、模块划分与 .sy 格式雏形

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

部分信息可能已经过时

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