FolderDock:基于 Rust + egui 的 Windows 多面板文件管理器项目

一个可以自由组装文件夹组合的文件管理工具(资源),能够快速搜索,能够使用正常在原系统文件件管理工具中的右键能力,能够正常对接鼠标文件右键和文件夹内部右键

分支1Tags10
文件最后提交记录最后更新时间
5 天前
5 天前
5 天前
5 天前
5 天前
14 天前
5 天前
5 天前
14 天前
5 天前
5 天前

FolderDock

作者个人站:https://softwarescience.top/ · 本项目主页:https://softwarescience.top/projects/folderdock(版本、截图与获取方式都在那儿)

一个用 Rust + egui 写的 Windows 文件管理器:把任意多个文件夹拼装成可嵌套的组合树, 一键切换整套工作目录,配毫秒级模糊搜索与系统原生右键菜单。

不需要 WebView、不需要 Node,cargo build 一把梭;右键菜单不是自绘替代品,而是直接调用 Windows shell 的 IContextMenu——所以「打开方式」「发送到」「属性」「7-Zip」「Git Bash Here」 之类第三方项全都在。

组合树:项目 → 嵌套组合 → 文件夹

一个组合就是一个项目;组合下面可以有任意子组合与任意文件夹,深度不限,像文档大纲:

甲项目                     ← 项目(顶层组合)
├── 前端                   ← 子组合
│   ├── src                ← 文件夹
│   ├── ui
│   └── 参考               ← 再嵌一层
│       ├── Desktop
│       └── ligen
└── ligen

选中任意节点,主区域就把它子树里的全部文件夹按深度优先并排成面板(选项目根 = 看整个项目, 选一个文件夹 = 只看那一个)。面板标题第二行显示所属组合的面包屑(如 甲项目 / 前端 / 参考)。

  • 拖拽改结构:拖到组合中间 = 放进去,拖到行上/下沿 = 插到前面/后面(不允许把组合拖进自己的子树)。
  • 组合可以改名、换标识色、复制(含整棵子树)、删除;文件夹节点就是真实路径,不提供改名 (避免让人误以为重命名了磁盘上的文件夹)。
  • 项目可拖动排序、复制、删除(至少留一个)。

特性

  • 两列侧栏:左列项目(点项目 = 看整个项目),右列当前项目的组合树(缩进 + 展开折叠 + 子树文件夹数)。
  • 多面板 Dock:每个文件夹一个面板,可并排、拖分隔条调宽度、独立导航(返回/上级/刷新/关闭)。
  • 文件夹双击语义:双击文件夹用系统资源管理器打开;按住 Ctrl 双击则在当前面板内进入该文件夹 (面板的后退栈会记住原目录)。文件仍交给系统默认程序打开;状态栏常驻这条提示。
  • 原生右键:
    • 文件/多选右键 → 系统 shell 的完整右键菜单(含「发送到」「打开方式」这类动态子菜单);
    • 面板空白/空目录右键 → 文件夹背景菜单(新建、粘贴、在此打开终端、属性…)。
  • 右侧布局可选:顶栏「▦ 布局」菜单里选「一排(可拖宽)」或任意「X 行 × Y 列」网格 (列数/行数各留 0 = 自动:给了行数就按 ⌈文件夹数 / 行数⌉ 算列数;面板多于格子时行数自动增长, 绝不隐藏面板)。网格里每格等宽,一排布局下可以拖分栏调宽。
  • 拖拽(系统级 OLE):
    • 面板里选中的文件/文件夹可以拖到资源管理器或别的程序;
    • 把文件夹拖到组合树上 = 加进这个组合(只做结构,不动文件系统);
    • 把东西拖到面板上 = 复制/移动进该文件夹(同卷默认移动、跨卷自动复制,Ctrl 强制复制、Shift 强制移动), 同名冲突自动改成 name (2);
    • 内外部拖拽走同一条 OLE 路径(本窗口也注册成放置目标),所以从资源管理器拖进来和面板之间互拖行为一致。
  • 快速搜索:对当前组合(或整个项目)的文件夹建后台增量索引,输入即出结果; 45k 条索引下单次查询约 6–7 ms。
  • 设置页面(顶栏 ⚙ 或 Ctrl+,):语言、主题(深/浅/跟随系统)、强调色、展示字体(枚举系统 字体,217 个可选)、字号、界面密度、隐藏文件与 .gitignore 开关、数据保存位置。全部即时生效并落盘。
  • 数据位置与安装:数据目录通过指针文件解析,安装器可分别指定安装路径与数据路径(见下文)。
  • i18n:所有展示文本走文案表(简体中文 / English 两版),窗口标题也跟着语言走; 切语言连设置窗口本身一起变。
  • 虚拟滚动(几万条目不卡)、多选与键盘导航、真实系统图标(取不到时回落内置矢量图标)。

快捷键

快捷键 作用
Ctrl+F 聚焦搜索框
Ctrl+, 打开设置
Ctrl+O 选一个文件夹加入当前组合
Ctrl+R / F5 刷新全部面板
Ctrl+Shift+R 重建搜索索引
Esc 清空搜索 / 关闭设置
↑ ↓ / Home / End / PgUp / PgDn 移动选择(Shift 连选)
Ctrl+A 全选(激活面板)
Enter 打开选中项
Backspace 回上级目录

搜索语法

全部条件「与」关系,空格分隔,可混用:

写法 含义
report 文件名模糊匹配(按匹配位置打分,越靠前越靠上)
*.rs / main?ts 文件名通配(* 任意串、? 单字符)
dir:src 或 src\ui 所在目录路径包含该片段
ext:rs,toml 扩展名白名单
-node_modules 排除:名称或路径包含该片段

例:main ext:rs dir:src -test → src 目录下、扩展名 rs、名字含 main、不含 test。

数据位置与安装

数据目录可迁移:真正的位置记在指针文件里,解析顺序是 FOLDERDOCK_CONFIG_DIR(环境变量)→ 指针文件(默认 <默认数据目录>/location.txt)→ 平台默认目录。 工作区与日志都跟着它走。设置页的「数据保存位置」可以直接改,改完当场把工作区搬过去并写好指针。

平台 默认数据目录 默认安装目录
Windows %APPDATA%\FolderDock %LOCALAPPDATA%\Programs\FolderDock
Linux ~/.local/share/folderdock ~/.local/lib/folderdock
macOS ~/Library/Application Support/FolderDock ~/Applications/FolderDock

打包与安装(Windows 已实现,Linux 有 .desktop 实现)

powershell -ExecutionPolicy Bypass -File scripts/dist.ps1 -Release   # 组装 dist/FolderDock/ 与 zip
.\dist\FolderDock\folderdock-setup.exe                              # 图形安装器

安装器可以分别指定安装路径与数据路径,并可勾选「创建开始菜单与桌面快捷方式」「登记到应用和功能」; 安装器自己会被复制成安装目录里的 uninstall.exe,所以卸载不依赖安装包还在不在; 双击这个 uninstall.exe 就是卸载(先确认,默认保留用户数据),带 --silent 等参数时走命令行。

命令行模式(脚本/CI 用,报告按 键=值 逐行输出,成功退 0):

folderdock-setup.exe --silent --install-dir=D:\Apps\FolderDock --data-dir=D:\Data\FolderDock [--no-shortcuts] [--no-register]
folderdock-setup.exe --uninstall --silent --install-dir=D:\Apps\FolderDock [--purge-data]
folderdock-setup.exe --help

卸载默认保留数据目录(只删安装目录、快捷方式与登记项),--purge-data 才连数据一起删; 程序正在运行时,报告会说明哪些文件删不掉,并自动交给临时副本收尾(等主程序退出后把安装目录删干净)。

多平台设计

安装/卸载的平台无关流程只有一份(src/install/mod.rs:复制文件、写数据目录指针、迁移数据、卸载时保留用户数据), 平台差异放在 src/install/platform/<平台>.rs:Windows 用 IShellLinkW 建 .lnk + 注册表登记卸载项; Linux 写 XDG .desktop(菜单项 + 桌面项);macOS 的默认目录已给出,.app 打包尚未实现。

配置与日志

项 位置 / 开关
工作区配置 <数据目录>\workspace.json(默认 %APPDATA%\FolderDock\workspace.json)
日志 <数据目录>\folderdock.log
数据目录覆盖 环境变量 FOLDERDOCK_CONFIG_DIR
指针文件覆盖 环境变量 FOLDERDOCK_POINTER_FILE(测试/便携安装用,避免动真实 %APPDATA%)
日志同时输出到 stderr FOLDERDOCK_LOG_STDERR=1

配置文件格式为 v2(组合树)。v1(旧的「组 = 一组平铺文件夹」)会按顶层键自动识别并迁移: 每个旧组变成一个项目,组里的文件夹成为该项目的直接子文件夹。

自动化钩子(脚本取证用,正常使用不需要):

环境变量 作用
FOLDERDOCK_DEBUG_MENU=file|folder 首个面板加载完成后自动弹一次对应的系统原生右键菜单

开发

cargo run                  # 启动调试构建
cargo build --release      # 正式构建 → target/release/folderdock.exe
cargo test                 # 单元测试(组合树/迁移/搜索语法/i18n/图标路径解析等)
cargo clippy --all-targets # lint(保持零警告)

依赖只走 crates.io(本机已配 rsproxy 镜像);不需要 Node/npm。首次构建要编译 egui/winit/wgpu, 之后增量很快。

程序图标:assets/folderdock.ico(16–256 多档)由 build.rs 通过 winresource 编进两个 exe 的 资源段,运行中的窗口再用同源 assets/folderdock.png 设 winit 窗口图标。改图标只需跑 python scripts/gen-icon.py(需要 Pillow)重新生成这两份资源,正常构建不需要 Python。 scripts/dist.ps1 会从成品 exe 读图标与版本资源,读不到就让打包失败。

目录结构

路径 职责
build.rs / assets/ 把 .ico 编进 exe 资源段(图标 + 版本信息);图标源文件与生成脚本
src/main.rs 入口、eframe 帧循环、窗口句柄、设置/主题的套用时机、落盘
src/model.rs 组合树模型(项目/嵌套组合/文件夹)+ 设置 + JSON 持久化与 v1 迁移
src/i18n.rs 文案表(中/英)与取文案的 API
src/fsops.rs 目录列举、排序、元数据格式化
src/search/ 后台增量索引(可取消、LRU 保留根)+ 查询语法与打分
src/shell/ Windows shell 集成:原生右键菜单、图标提取、原生对话框、系统字体枚举
src/ui/ egui 界面:主题、项目列、组合树、面板、文件列表、搜索框、设置页、矢量图标

GUI 验证工具

.verify/win.ps1 是一套 PowerShell + P/Invoke 的窗口工具(枚举窗口、截图、真实/直投鼠标与键盘、 拖拽、取色、样式位),自带自测:

powershell -NoProfile -ExecutionPolicy Bypass -File .verify/win.ps1 selftest

已知边界(有意不做 / 暂未做)

  • 组合树内部的行拖拽目前只有同一组合内的重排生效:落点只按被拖行自己的矩形算 (src/ui/sidebar.rs::interactions),拖到别的组合或别的行上不会记落点——上面「组合树」一节写的 「拖到组合中间 = 放进去、拖到行上/下沿 = 插到前面/后面」这一条还没实现。注意别和文件级拖放混了: 面板 ↔ 资源管理器 ↔ 面板/组合树 的拖放(系统 OLE)是好的。
  • 面板顺序由组合树决定(结构在侧栏改,不提供拖面板本身排序);面板宽度是每个文件夹自己的状态。
  • 搜索索引默认尊重 .gitignore 并跳过隐藏项(设置页可关);每个搜索根最多 30 万条,超出截断并在状态栏提示。
  • 面板内容在窗口重新获得焦点时刷新;没有文件系统实时监听。
  • 删除/重命名/新建等写操作一律交给系统右键菜单,程序自己不提供「危险按钮」。
  • 单实例没有互斥;同时开两份会互相覆盖同一份配置文件(用 FOLDERDOCK_CONFIG_DIR 可隔离)。

版本历史

版本 日期 要点
0.3.1 2026-10-22 修卸载器误删别的安装:在临时目录/默认目录里跑卸载时,原来会按固定路径删掉开始菜单与桌面快捷方式,并无条件清除唯一的 Uninstall\FolderDock 登记项——即使真正的安装装在 D:\...。结果程序文件还在,但启动器(靠 .lnk 索引应用)和「应用和功能」都找不到它。现在只删「目标指向本次安装目录主程序」的快捷方式,只在 InstallLocation 与本次安装目录一致时才清登记;--install-dir 指错且目录里既无主程序也无卸载器时,也不再删文件
0.3.0 2026-10-22 新增文件夹双击语义:默认双击文件夹交给系统资源管理器打开;按住 Ctrl 双击才在当前面板内进入该文件夹(走 NavigateFolder,后退栈保留原目录)。文件双击仍用系统默认程序。状态栏常驻这条使用说明(FolderDoubleClickHint,中英双版)。.verify/win.ps1 click 增加 -Ctrl,用于真实 Ctrl+点击的 GUI 验证
0.2.6 2026-10-22 修 exe 没有程序图标:仓库里既没有 .ico 也没有资源编译步骤,装完之后资源管理器、任务栏、开始菜单/桌面快捷方式全显示系统通用空白图标。现在 build.rs 用 winresource 把 assets/folderdock.ico(16–256 多档)编进两个 exe 的 RT_ICON/RT_GROUP_ICON,并带上产品名与文件/产品版本;运行中的窗口用同源 PNG 设置 winit 窗口图标。scripts/dist.ps1 增加资源段守卫:打包时从成品 exe 里读图标与版本,缺失直接失败,避免再把无图标产物发出去
0.2.5 2026-10-21 修安装目录里的 uninstall.exe:它还是安装器副本,双击(无参数)会打开安装界面。现在按文件名识别,双击直接弹卸载确认(默认保留用户数据),完成后退出;带 --uninstall / --silent / --help 时仍走原来的命令行。另修 GUI 卸载停在结果对话框时临时清理副本提前放弃、留下 uninstall.exe 的问题:副本先等原进程退出再清理,并把子进程 stdio 设为 null(GUI 卸载器 FreeConsole 后无效句柄会让 CreateProcess 报 error 50)
0.2.4 2026-10-21 双击启动不再多出一个空控制台:主程序改为 Windows GUI 子系统(console 子系统的进程会被系统分配控制台,关掉控制台等于结束进程)。安装器无参数打开图形安装界面时主动 FreeConsole,--silent / --uninstall / --help 仍保留控制台,脚本可继续同步读取 stdout 与退出码
0.2.3 2026-10-21 修改名:项目根同时出现在项目列表和组合树根,两处都画了同一个 id 的输入框(egui ID clash),一次按键被两个 TextEdit 同时处理,项目名/组合名因此改不对;现在记录改名的来源栏,只画一处,两栏共用同一个缓冲区。另修非当前项目改名静默失败(rename_node 只认 active_project),并统一去掉首尾空白、拒绝空名。文件夹节点不再提供改名:它只是真实路径,改显示名不会动文件系统,容易让人误以为文件夹被重命名(旧的 label 字段随配置忽略)
0.2.2 2026-10-13 修组合树内部的排序拖拽:落点原来只在被拖行自己的矩形上算(parent/index 也取自它自己),拖到别的行上时目标仍是它自己,所以看着像"拖了没反应";改成每一行各自判断指针是否落在自己身上并认领落点(组合行中带 = 放进该组合、行的上半 = 插到它前面、下半 = 插到它后面),落点提示线位置与实际插入位置一致;顺带修"拖着行滑出树外松手仍按旧落点改结构",并补回"越过拖动阈值才算数"的闸门(单击不会误排)
0.2.1 2026-10-13 修拖拽:窗口根本没被注册成 OLE 放置目标(没开 winit 的 drag_and_drop),于是拖进面板 / 拖到组合树 / 从资源管理器拖进来全都拿不到落点、DoDragDrop 只回 DROPEFFECT_NONE;同时补齐协议(EnumFormatEtc、CFSTR_PREFERREDDROPEFFECT、接受 SetData(CFSTR_PERFORMEDDROPEFFECT)),落点位置改用系统光标(拖拽期间 winit 收不到鼠标移动,egui 记的还是按下那一刻的旧值)。面板↔面板、面板→组合树、从资源管理器拖进来、以及拖出到资源管理器四条路径均已实测通过(拖出那次日志:落点回报所做的效果 = 2 → 拖放结束:Move)
0.2.0 2026-10-13 拖拽能力:面板里选中的项可拖到资源管理器/其他程序(系统 OLE),把文件夹拖到组合树上即加入该组合、拖到面板上即复制进该目录(Shift 强制移动、同名自动改名);右侧面板布局可选(一排 / N 列 / N 行 / 自定义 X 行 Y 列);面板最窄宽度 + 装不下时横向滚动条;修「点组合里的文件夹不展示内容」
0.1.0 2026-10-13 首个发布版:可嵌套的组合树(项目 → 任意子组合 → 任意文件夹)、多面板 Dock、系统原生右键菜单(文件 / 文件夹两类)、后台增量索引 + 模糊搜索、设置页(语言 / 主题 / 强调色 / 字体 / 字号 / 密度 / 数据位置)、安装器(可分别指定安装路径与数据路径,--silent / --uninstall)与可迁移的数据目录指针文件

许可

Apache-2.0,见 LICENSE。

项目介绍

一个可以自由组装文件夹组合的文件管理工具(资源),能够快速搜索,能够使用正常在原系统文件件管理工具中的右键能力,能够正常对接鼠标文件右键和文件夹内部右键

定制我的领域