1606 字
8 分钟
SFC 开发日志(三):CLI 稳定化、Qt GUI 与发布

项目仓库: Gitee | GitHub

处理目录块边界、GUI 、UTF-8 路径、策略模式、单文件发布等问题。

上一篇:SFC 开发日志(二)

2026 年 3 月 2 日到 2026 年 3 月 15 日:CLI 稳定化#

CLI debug、refactor。FlagType 改成强类型枚举,目录接口、工具类接口、文件已存在时的处理方式、目录队列逻辑同步整理。目录标准、文件标准、分割标准共享同一组枚举和偏移量规则,目录恢复与数据区读取都按统一类型解释。

enum class FlagType : char
{
Directory = '0',
File = '1',
Separated = '2',
LogicalRoot = '3',
SymbolLink = '4'
};

目录块边界写入问题。目录条目恰好落在分块边界时,流程没有正常进行,产生空分块或目录解析错位,具体问题在于请求的流程逻辑的遗漏。

关于长路径问题。尝试在PathTransfer::transPath() 给绝对路径加上 \\?\ 前缀,用于解决 Windows 路径长度限制。由于操作系统实际上还是禁止了长路径的出现,项目只能使用 Windows 路径处理和 UTF-8 中文路径。

2026 年 4 月 1 日:构建系统调整#

构建系统改为 MSVC + CMake。关闭CMAKE_INTERPROCEDURAL_OPTIMIZATION

仅仅是为了使用VS的性能分析报告

2026 年 4 月 12 日到 2026 年 4 月 15 日:文档整理与 GUI 工程建立#

代码清理与 GUI 开发。开始编写 Qt Widgets 。编写CMake 配置和后台任务执行框架。

GUI 的设计隔离: Y_ManagerCompressorFileSystem负责主逻辑。GUI 负责参数录入、结果展示和线程调度。

修复directoryOffset 的写入时机问题。

2026 年 4 月 16 日:Qt GUI 主体#

GUI 主体围绕 MainWindowCompressionWorkerQThread 组织。MainWindow 收集源路径、输出目录、模式和密码。CompressionWorker 在后台线程调用 MainLoopCompressionLoopDecompressionLoop。进度通过信号送回 UI 线程。界面层不直接访问目录块、数据区和压缩模块。

MainWindow (UI线程)
-> QThread
-> CompressionWorker
-> CompressionLoop / DecompressionLoop
<- detailedProgress / finished

GUI 接入后,进度信号频率需要限流。后台线程若每处理一小段数据就发出信号,UI 线程会堆积刷新请求。处理方式分成两层:MainLoop 控制核心层回调频率,CompressionWorker 按时间和百分比变化量再做一层节流。双层节流下,进度显示保持连续。

窗口关闭期间的线程退出。后台线程执行中直接关闭窗口,文件句柄、缓冲区和输出状态容易残留。GUI 因此加入 std::atomic<bool> m_stopRequested。主线程发出停止请求,后台线程在进度回调和循环中检查标记,析构阶段等待线程退出。停止逻辑只处理线程与资源,不改协议结构。

文件句柄和缓冲区释放。BinaryStandardLoader::setAllLoopDone()DecompressionLoop::createFile()std::vector 缓冲复用、Heffman::merge_ttabs() 的容量释放都进入正式代码。长任务运行期间,已经处理完的缓冲区会及时释放。解压阶段输出文件句柄也会在写入结束后关闭。

中文路径与编码处理#

GUI 接入后的路径编码差异。Qt 层传入 UTF-8 字符串,std::filesystem 在 Windows 下返回的路径文本可能关联本地代码页。路径拼接、文件名恢复和日志显示都依赖统一转换规则,中文输出目录尤其敏感。

修正规则集中在 EncodingUtils。Qt 边界处统一使用 UTF-8 作为文本协议,QString 进入核心层前先转 UTF-8,进入文件系统前再用 pathFromUtf8(),从 std::filesystem::path 回到日志或 GUI 时再用 pathToUtf8()。目录遍历和文件名序列化统一使用 entry.path().filename().u8string()toStdString()。关于输出目录乱码:UTF-8 文本先转路径对象,再交给 DecompressionLoop

统一规则覆盖中文路径、中文输出目录、日志显示和 GUI 展示。 EncodingUtilsQStringstd::stringstd::filesystem::path 统一处理三个文本体系的路径逻辑。

Qt 工具链与系统兼容性#

GUI 发布的依赖为 Qt 6.2.4 LTS。MSYS2 MinGW 15.x 构建版本在运行时出现过 nanosleep64 缺失,Qt 6.10.1 的部分 API 在旧版 Windows 10 环境下也不稳定。Qt 6.2.4 LTS 用于统一图形界面、路径转换、线程模型和静态发布环境。

GUI 兼容 Windows 10 1809 及以上版本。

2026 年 4 月 17 日:多策略支持与发布形态调整#

主流程原本把 Huffman + AES 写死在内部。重构后,CompressionMode 枚举、StrategyFactoryICompressionIEncryptionNullCompressionNullEncryption 一并接入,压缩和加密组合改由运行时装配。

enum class CompressionMode : uint8_t
{
HuffmanAES = 0,
HuffmanOnly = 1,
AESOnly = 2,
PackOnly = 3
};

CompressionLoopDecompressionLoopBinaryStandardLoader 由依赖具体类改为依赖接口。HeaderWriter 负责把策略号写入文件头,解压侧通过 Header.strategy 还原模式。策略号 0 继续映射 HuffmanAES,旧归档文件保持兼容。

发布形态同步调整。动态部署包体约 57MB,Qt DLL、渲染依赖和资源文件分散在目录中。静态发布改用 Qt 6.2.4 静态库,构建开关通过 USE_STATIC_QT 控制,翻译文件和图片资源内嵌进可执行文件,背景图从 PNG 改成 JPEG。默认发布体积约 16MB,发布目录不携带额外依赖。

2026 年 4 月 18 日到 2026 年 4 月 19 日:编码整理、翻译与工程清理#

编码规则固定为:GUI 输入统一转 UTF-8,核心层字符串按 UTF-8 组织,真正接触文件系统时再转成 std::filesystem::path。规则覆盖 GUI 压缩输入、解压输出目录、目录遍历结果和日志文本。编码转换职责全部归入 EncodingUtils

GUI 多语言规则固定为:界面文案统一使用 tr() 包装,翻译资源通过 resources.qrc 内嵌,语言选择优先读取 SFC_GUI_LANGUAGE,没有显式指定时再读取 QLocale::system()。单 exe 发布下,翻译资源不依赖外部目录。日志和技术状态文本保持英文,控件文本按语言环境切换。

工程整理还包括头文件、命名空间、本地构建目录 .gitignore 和临时验证目录清理。目录块规则、编码规则、GUI 工具链和策略模式稳定后,代码布局与功能布局对齐。

结果#

从CLI 到桌面程序(GUI)。处理的问题:目录块写入顺序、目录恢复队列、输出目录编码、目录偏移量回填和目录块加密、GUI、多策略和单文件发布。


返回项目介绍:SFC

SFC 开发日志(三):CLI 稳定化、Qt GUI 与发布
https://www.yonagi.world/posts/sfc-dev-log-3/
作者
YONAGI
发布于
2026-04-29
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

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