一个可以自由组装文件夹组合的文件管理工具(资源),能够快速搜索,能够使用正常在原系统文件件管理工具中的右键能力,能够正常对接鼠标文件右键和文件夹内部右键
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 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。