最近我在做一个 Windows 桌面端远程文件管理工具,项目名叫DirBridge。
DirBridge 的目标是提供一个类似 Xftp 的本地与远程双栏文件管理体验:左侧管理本地文件,右侧连接远程服务器,通过图形界面完成目录浏览、文件上传、文件下载、拖拽传输、多会话管理等操作。
项目地址:
GitHub:https://github.com/shy117/DirBridge
目前项目已经完成了第一阶段 MVP 的主要流程,并且可以进行打包发布。本文主要介绍这个项目的设计目标、当前能力、技术选型和开发过程中的一些实践思考。
一、为什么做 DirBridge
在日常开发和部署过程中,经常会遇到本地和远程服务器之间传输文件的场景。
常见需求包括:
- 把本地构建产物上传到服务器
- 从服务器下载日志或配置文件
- 浏览 FTP / SFTP 远程目录
- 同时连接多个远程站点
- 查看文件传输状态、速度和失败原因
成熟工具当然已经很多,但我还是希望自己做一个远程文件管理工具,主要原因有三个。
第一,这是一个很适合练习 C++/Qt 桌面开发的真实项目。它不只是简单窗口和按钮,而是涉及文件系统、远程协议、任务队列、配置管理、日志、异步任务和 UI 状态同步。
第二,我希望通过这个项目搭建一个比较清晰的桌面软件工程结构,而不是把所有逻辑都堆在窗口类里。
第三,我希望它是一个可以长期迭代的小工具。先完成最核心的文件管理和传输能力,再逐步完善体验和功能。
所以 DirBridge 的目标不是一开始就做成一个“大而全”的工具,而是先把主流程做扎实:
能连接,能浏览,能上传下载,能管理任务,能稳定地继续迭代。
二、DirBridge 是什么
DirBridge 是一个面向 Windows 桌面场景的远程文件管理工具。
它的核心目标是提供类似传统 FTP/SFTP 客户端的双栏文件管理体验:
- 左侧是本地文件面板
- 右侧是远程文件面板
- 可以连接 FTP / SFTP 服务器
- 可以上传、下载、拖拽传输文件
- 可以同时管理多个远程会话
- 可以查看传输队列、进度、速度和日志
简单来说,DirBridge 想解决的是这样一个问题:
用一个清晰、直接、可维护的桌面工具,在本地文件系统和远程服务器之间建立一座桥。
这也是项目名 DirBridge 的含义:Directory Bridge(目录桥)。
三、当前已经支持的功能
目前 DirBridge 已经完成了第一阶段 MVP 的主要能力。
1. 本地文件浏览
DirBridge 提供本地文件面板,可以浏览本机目录结构,查看文件和文件夹信息。
本地面板支持常见文件管理操作,例如:
- 进入目录
- 返回上级
- 刷新目录
- 查看文件列表
- 右键操作文件或文件夹
在没有远程会话时,本地文件面板可以占满主要区域;连接远程站点后,再切换成本地和远程双栏显示。
2. FTP / SFTP 远程目录浏览
DirBridge 目前支持访问 FTP / SFTP 远程目录。
连接远程站点后,远程文件面板可以显示服务器上的目录和文件,并支持:
- 浏览远程目录
- 进入子目录
- 返回上级目录
- 刷新当前目录
- 查看远程文件大小、类型、修改时间等信息
远程文件列表采用详细信息视图,更适合文件管理工具的使用场景。
3. 站点配置管理
DirBridge 支持保存和加载站点配置,方便重复连接常用服务器。
站点信息可以按分组展示,也支持最近会话记录。这样在日常使用中,不需要每次都手动输入协议、主机、端口、用户名和远程路径。
当前站点管理主要包括:
- 保存站点
- 加载站点
- 编辑站点属性
- 按分组管理站点
- 记录最近连接过的会话
4. 多远程会话 Tab
DirBridge 支持同时打开多个远程会话。
每个远程会话都使用独立的 Tab 管理,并且每个会话都有自己的状态:
- 独立的连接状态
- 独立的远程路径
- 独立的远程文件面板
- 独立的远程后端实例
- 独立的会话名称
这样就可以同时连接多个服务器,或者连接同一服务器的不同目录。
关闭、断开或重连某一个远程会话时,不会影响其他已经打开的远程会话。
5. 上传、下载和拖拽传输
DirBridge 支持本地与远程之间的基础文件传输。
当前已经支持:
- 单文件上传
- 单文件下载
- 本地文件拖拽到远程面板上传
- 远程文件拖拽到本地面板下载
- 本地文件夹上传
- 远程文件夹下载
- 远程面板内部拖拽移动
这些操作都会进入统一的传输队列,而不是直接阻塞界面。
6. 全局传输队列
DirBridge 底部提供全局传输队列,用来展示上传和下载任务。
传输队列会显示:
- 名称
- 状态
- 进度
- 大小
- 本地路径
- 传输方向
- 远程路径
- 速度
- 估计剩余
- 经过时间
这样即使同时连接多个远程会话,也可以在一个统一的位置查看所有传输任务。
7. 目录传输聚合进度
文件夹上传和下载是远程文件管理工具中很常见的需求。
如果只把文件夹里的每个文件都拆成独立任务,用户很难判断整个文件夹传输了多少。因此 DirBridge 对目录传输做了聚合显示。
目录传输会显示为:
- 一个文件夹父任务
- 多个子文件任务
父任务负责显示整体进度,子任务负责显示具体文件明细。
例如上传一个文件夹时,传输队列中可以看到一个文件夹任务。展开后,可以查看里面每个文件的上传状态。默认情况下,子任务可以折叠起来,避免传输队列表格过于混乱。
这个设计让目录传输更加接近用户直觉:
我上传的是一个文件夹,所以我应该能看到这个文件夹整体传了多少。
8. 日志和基础运行检查
DirBridge 内部使用日志记录应用运行状态,包括程序启动、站点加载、远程连接、目录加载、上传下载和错误信息等。
日志既可以辅助开发调试,也可以帮助后续定位用户环境中的问题。
四、界面布局设计
DirBridge 的主界面采用比较传统的文件管理器布局。
整体结构包括:
- 顶部菜单栏
- 快速连接区域
- 左侧会话管理器
- 中间本地/远程文件双栏
- 底部传输队列和日志区域
这种布局没有追求复杂炫酷,而是优先考虑文件管理工具最重要的几点:
- 信息清晰
- 操作路径短
- 状态可见
- 多任务时不混乱
对于远程文件管理工具来说,用户最关心的是:
- 当前连接到哪里
- 当前目录在哪里
- 文件是否传输成功
- 出错时原因是什么
所以 DirBridge 的界面设计会尽量围绕这些问题展开。
五、技术栈
DirBridge 当前主要使用以下技术栈:
- C++17
- Qt Widgets
- CMake
- libcurl
- nlohmann/json
- spdlog
Qt Widgets 用于构建桌面界面。DirBridge 这种工具型软件更适合传统桌面控件体系,例如表格、树、Tab、菜单、右键菜单、文件列表等。
libcurl 用于处理远程协议访问,目前主要支持 FTP / SFTP 的连接、目录读取、上传、下载和远程文件操作。
nlohmann/json 用于配置文件读写,站点配置、用户设置等数据都可以通过 JSON 保存。
spdlog 用于应用日志,方便定位连接、传输和运行时问题。
CMake 用于项目构建和依赖组织。DirBridge 当前主要面向 Windows + MinGW + Qt 6 环境进行验证。
六、项目结构设计
DirBridge 在代码结构上尽量按职责分层,而不是让 UI 直接承担所有逻辑。
当前源码结构大致如下:
src/ ├── app/ Qt 应用入口 ├── ui/ Qt Widgets 界面 ├── core/ 纯 C++ 业务模型和调度 ├── protocol/ libcurl 等协议封装 ├── config/ JSON 配置读写 └── logging/ spdlog 日志封装大致分层思路是:
app层负责应用启动、命令行参数分发和主窗口创建。ui层负责界面展示和用户交互。core层负责文件模型、站点模型、传输任务和队列调度。protocol层负责封装 FTP / SFTP 等远程协议实现。config层负责配置读写。logging层负责日志初始化和日志写入。
这样做的好处是,UI 层不需要直接关心 libcurl 的调用细节,远程协议实现也不会和窗口控件绑定在一起。项目后续继续扩展时,各层职责会更清晰。
七、开发中重点解决的几个问题
1. 不让远程操作阻塞界面
远程连接、目录加载、上传下载和递归目录处理都可能比较耗时。
如果这些操作直接在 UI 线程中执行,界面就会卡住,用户体验会很差。
因此 DirBridge 在迭代过程中逐步把耗时操作放到后台执行,例如:
- 远程连接
- 文件上传
- 文件下载
- 目录传输准备
- 本地递归删除
- 远程递归删除
这样即使正在执行传输任务,主界面也可以继续操作。
2. 目录传输不能只显示零散文件
文件夹传输和单文件传输不同。
用户上传一个文件夹时,心里关注的是“这个文件夹传完了吗”,而不是只看到几十个零散文件任务。
因此 DirBridge 为目录传输设计了父子任务结构:
- 父任务表示整个目录
- 子任务表示目录中的具体文件
- 父任务聚合子任务进度
- 子任务可展开查看
这样传输队列既能显示整体状态,也能保留详细信息。
3. 多远程会话之间不能互相干扰
远程文件管理工具经常需要同时连接多个服务器。
如果所有远程状态都放在一个全局对象里,很容易出现状态混乱,例如:
- A 会话断开影响 B 会话
- 当前路径被其他会话覆盖
- 上传下载任务不知道属于哪个远程连接
DirBridge 使用远程会话模型来隔离这些状态。每个远程 Tab 都有自己的会话 id、站点配置、远程后端、文件面板和当前路径。
传输任务中也会记录相关路径和方向,方便在全局传输队列中追踪来源和目标。
八、当前状态和后续计划
DirBridge 当前仍处于 MVP 阶段,但主流程已经基本跑通。
已经完成的主要方向包括:
- Qt Widgets 主界面
- 本地文件面板
- 远程文件系统抽象
- FTP / SFTP 远程目录浏览
- 站点配置保存和加载
- 多远程会话 Tab
- 远程文件操作
- 上传下载
- 拖拽传输
- 全局传输队列
- 目录传输聚合进度
- 日志和基础配置
- Windows 发布包准备
DirBridge 后续会优先完善基础体验,而不是盲目增加大量高级功能。
目前比较明确的方向包括:
- 优化真实 FTP / SFTP 环境下的稳定性
- 完善 Windows 发布包和安装包体验
- 优化远程刷新、路径跳转等可能阻塞界面的流程
- 改进传输失败、取消、重试等异常路径体验
- 继续完善传输队列的可用性
- 根据实际使用反馈评估远程编辑、目录同步等功能
一些高级功能会放到后续阶段再考虑,例如:
- 远程编辑
- 文件夹比较
- 目录同步
- SSH 终端
- 插件系统
当前阶段还是先把远程文件管理这个核心场景做稳。
九、项目地址
如果你也对 C++/Qt 桌面开发、远程文件管理工具或者 FTP/SFTP 客户端实现感兴趣,欢迎关注 DirBridge。
项目地址:
GitHub:https://github.com/shy117/DirBridge
也欢迎提出建议、反馈问题,或者一起交流桌面工具开发中的工程实践。
总结
DirBridge 是我正在开发的一个 Windows 远程文件管理工具,目标是提供类似 Xftp 的本地与远程双栏文件管理体验。
它目前已经完成了本地文件浏览、FTP/SFTP 远程目录浏览、站点配置、多远程会话、上传下载、拖拽传输、传输队列和目录聚合进度等基础能力。
后续我会继续围绕稳定性、易用性和真实场景体验进行迭代。
如果你也在做 C++/Qt 桌面项目,或者对远程文件管理工具的实现感兴趣,欢迎关注这个项目。