SFC(Simple Files Compressor)面向 Windows,输出格式为自定义 .sy。项目围绕归档协议、目录块写入、偏移量维护、路径编码转换和压缩加密组合展开。CLI 与 Qt GUI 共用核心层,界面层负责参数、进度和线程调度。
对象
工程对象分成协议层、目录层、数据层、界面层。协议层由 HeaderWriter、Locator、BinaryStandardLoader、EntryParser 组成,核心字段包括 strategy、version、directoryOffset、compressedSize。目录层由 EntryProcessor、LogicalRoot、Directory、File、Separated、SymbolLink 组成,负责目录树和目录块。数据层由 CompressionLoop、DecompressionLoop、DataLoader、DataExporter、StrategyFactory、ICompression、IEncryption 组成,覆盖 Huffman、AES 和数据块读写。界面层由 MainWindow、CompressionWorker、QThread 组成,负责输入路径、模式、密码、进度和停止控制。
.sy 协议对象固定为三段:19 字节文件头、目录块区域、数据块区域。目录块前置 Separated 标准,数据块按文件拆分,树数据和压缩数据各自带分块信息。路径对象统一经过 EncodingUtils::pathFromUtf8()、EncodingUtils::pathToUtf8() 和 path.u8string()。
职责
HeaderWriter 和 Locator 负责文件头写入、目录偏移回填、compressedSize 回填和块边界维护。BinaryStandardLoader 负责目录块读取、目录块解密和标准项装配,EntryParser 负责按 FlagType 解析目录项、文件项、逻辑根目录项和分割项。EntryProcessor 负责把输入路径转成目录树,再序列化进目录块。
CompressionLoop 负责压缩主循环,DecompressionLoop 负责解压主循环,DataLoader 负责原始数据读取,DataExporter 负责树数据、压缩数据和分块标准写出。StrategyFactory 按 CompressionMode 组装 HuffmanAES、HuffmanOnly、AESOnly、PackOnly。MainWindow 和 CompressionWorker 只负责任务调度、进度回调和线程停止,不处理协议细节。
流程
归档流程从输入路径列表进入 EntryProcessor。输入源先挂到 LogicalRoot,再按 BFS 顺序写成目录项和文件项。目录块按 16KB 分块,每块前写入 Separated 标准,块内记录 blockSize 和 AES-CFB 的 IV。目录块写完后,HeaderWriter 回填 directoryOffset,文件体写完后,Locator 回填 compressedSize。
解压流程从文件头开始。读取 strategy、version、directoryOffset 后,BinaryStandardLoader 逐块读取目录块,检查 IV,决定是否解密,再把二进制数据交给 EntryParser。EntryParser 按 Directory、File、LogicalRoot、Separated、SymbolLink 拆成 directoryQueueReady、entryQueue、fileQueue。DecompressionLoop 先创建目录,再按 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_1、magicNum_2,模式识别依赖 strategy,目录读取依赖 directoryOffset,数据读取依赖 compressedSize 和 blockSize。目录块、数据块、IV、偏移量都写进归档内部,不依赖外部清单。
目录 EntryProcessor、BinaryStandardLoader、EntryParser。输入路径、逻辑根目录、BFS 队列、childCount 和目录恢复都停在这一层。压缩:CompressionLoop、DecompressionLoop、ICompression、IEncryption,算法替换不改协议主流程。编码问题用: EncodingUtils,并且Qt、std::string、std::filesystem::path 不应当脱离转换混用。GUI 部分有 MainWindow 和 CompressionWorker,界面层不接触目录块、文件头和数据区。
限制
当前版本以 Windows 为主,路径处理和文件系统行为按 Windows 规则组织。主流程仍是单线程顺序处理,ThreadPool 和 Scheduler 还停在接口和实验代码层。压缩算法当前只有 Huffman,AES 还是纯软件实现,长路径分支没有进入发布版本。
部分信息可能已经过时
粤公网安备44011102484817号