GPUI 生态正在冒头:Zed 之后,disktree 会成为第二个爆款吗
【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust + GPUI.项目地址: https://gitcode.com/gh_mirrors/di/disktree
当 Rust 社区还在为"谁能做出真正可用的原生 GUI 应用"争论时,Zed 用 GPUI 给出了一个答案:一套底层走 GPU 渲染、上层全权交给开发者掌控的 UI 框架。而如今,GPUI 生态正在从"Zed 的私有引擎"演变成"普通人也能快速造应用"的公共基础设施。2026 年 9 月,一个名为 disktree 的磁盘空间分析工具在中文技术社区被密集拆解——从新手教程到并行扫描算法、从分类引擎到安全删除规则,一周之内出现十余篇源码级解读。它没有 Electron 的体积包袱,没有 Tauri 的 Web 壳,是一个纯粹的 Rust + GPUI 原生桌面应用。本文将结合仓库源码,拆解 disktree 为什么能在这个框架红利期被看见,以及它能否成为 GPUI 生态的"第二个爆款"。
GPUI 生态现状:从 Zed 的私有引擎到可复用的开源栈
GPUI 的价值已经在 Zed 编辑器上得到验证——一个纯 Rust 写出的、能在毫秒级响应复杂界面的编辑器。但"能写编辑器"和"普通人能拿来写应用"之间,隔着一层厚厚的抽象缺口。disktree 的依赖结构恰好展示了这个缺口正在被补齐:
gpui-kit = { version = "=0.6.6", default-features = false, features = ["assets"] } gpui-omarchy = "0.1.3"在 crates/disktree-app/Cargo.toml 中可以看到一个清晰的三层结构:底层是 GPUI 渲染核心,中间是 gpui-kit 提供的窗口、焦点、事件等应用级能力,上层是 gpui-omarchy 负责的主题接入。disktree 不用手写任何窗口初始化、主题切换或资产加载逻辑——它只是调用gpui_kit::application(),然后专心做自己的事。
这个生态还处在"版本精确钉死"的早期阶段(=0.6.6表示不兼容任何其他 0.6.x),但它已经具备了成熟生态该有的形态:feature 开关、资产系统、测试支撑(test-supportfeature 被单独列为 dev-dependencies,供窗口测试使用)。更重要的是,disktree 的选择本身就是在给生态投票——它证明 GPUI 应用可以做到"小而美",而不是只有 Zed 这种万行级巨型项目才配得上 GPU 渲染。
界面即产品:一个树图如何把"磁盘清理"变成可读语言
disktree 的官方截图已经能说明它的产品哲学:
磁盘空间工具的老问题是:du的输出是一堆难读的数字,图形化工具又往往止步于"展示"。disktree 用一套视觉编码把两个核心问题——"这是什么"和"能不能删"——变成了可以一眼读出的信息:颜色表示数据类型,斜纹表示可回收空间,琥珀色单独留给选中项和关键操作,避免信息过载。
这套编码不是拍脑袋设计的,它的判断逻辑全部集中在 分类引擎 中,采用三段式识别策略:
- 目录名查表:
category_of_name对目录名做小写化匹配——.cargo、.rustup、.nvm归入 Toolchain,.codex、.claude、.cursor、tries、experiments归入 AgentScratch(AI Agent 工作区),.git归入 Git,甚至处理了 Windows 上OneDrive - Contoso、Dropbox (Contoso)这类组织账号目录; - Git 仓库形状检测:
is_git_store通过objects、refs、HEAD三个子目录判断一个裸仓库,跟它叫什么名字无关; - 内容启发式归类:
dominant_child_category对未知目录下钻最多三层,取其最大可识别子目录的类型——~/world里大部分是.git,所以它就是 Git。
分类结果自顶向下继承:一个目录的类型会传给它内部所有未知名的子孙,~/src/tries/2026-09-01里的实验目录会自动继承 AgentScratch 类型。可回收判定(reclaim_of)则更谨慎,引入了邻居检查:target只有旁边躺着Cargo.toml时才算构建产物(BuildOutput),node_modules只有旁边有package.json才算可重装依赖,logs只有旁边有Application Support才算临时文件。这样 9 种可回收类型(缓存、同步历史、包存储、构建产物、可重装依赖、沙箱层、快照、回收站、临时文件)的斜纹标识,永远不会把 Steam 游戏库误判成缓存——仓库里专门有一条回归测试验证这个场景。
性能叙事:秒级扫描背后的三重并行优化
CSDN 上流传最广的 disktree 文章,几乎都围绕一个事实展开:从家目录扩展到整块磁盘只需要几秒。这个结果不是玄学,在 scan.rs 里可以逐行验证:
rayon::scope平铺任务调度:每个扫描根只开一个 scope,递归深度 O(1),无论目录树多深都不会爆栈;- 原子完成计数器 + 哨兵:每个目录的
pending计数器从 1 起步,每多一个子目录任务加 1,归零才允许构建节点,保证"目录的所有子树都扫完才聚合",杜绝丢子树; - 自底向上单次聚合:
tree::aggregate从叶子向上一次性汇总字节数、文件数与目录数,硬链接去重也在这趟完成——同一 inode 的两个名字只计一次。
更讨巧的是扫描结果记忆化。当用户从~扩展到/时,已经测量过的子树通过Known结构体整体复用,宽扫描只读家目录之外的部分。这正是社区文章中"从家目录扩展到整个磁盘只需要几秒"的真相——它不重新扫描,它只补差价。
Windows 平台则换了一套打法:mft.rs 借鉴 WizTree 的思路,管理员权限下直接读 NTFS 主文件表(MFT),一次大块读取替代逐目录遍历。仓库注释给出了实测数据:400 万文件的C:\,disktree 约 3.4 秒,WizTree 约 11.2 秒,普通目录遍历约 20 秒。而普通权限下,Windows 目录列表用FileIdExtdDirectoryInfo顺带取到分配大小,测量零额外开销。
连并发本身都在被治理:power.rs 提供 Miser / Balanced / Aggressive / Drain-my-battery 四档电源预设(分别对应 2 / 4 / 8 / 全部 CPU 线程),scan_threads.rs 里还有一个可选的自适应准入控制器:以吞吐量采样二分搜索最优并发数,同时用系统 CPU 占用率做上限调节,确保全盘扫描时整机不被拖垮。一个磁盘工具对"别打扰用户"的执念,到了这种程度。
安全删除:让"清理工具"敢于承担破坏性操作
磁盘清理工具最大的信任危机是误删。disktree 把删除安全做成了产品核心,五条硬规则全部落在 removal.rs,且计划(plan)与执行(execute)两个阶段双重校验:
- 只允许删除扫描根之下的路径;
- 文件系统根、扫描根、家目录一律拒绝;
- 挂载点及其内部一律拒绝——删除它会跨进另一个文件系统;永久删除在挂载边界处停止下钻;
- 持有家目录或系统树(
/usr、/etc、/opt/homebrew、/nix/store等)的目录拒绝删除; - 符号链接只解链、不跟随,路径永不经过 Shell 执行——叫
-rf的文件只是个文件。
Windows 上规则进一步收紧:路径大小写不敏感匹配、C:\Users\*下的每个用户配置文件目录均受保护(因为提权后的 disktree 可能以其他账户运行)、跨卷隔离。
与删除配套的是"删前知情":git.rs 在选中一个 Git 检出目录时,离线线程用git status --porcelain、reflog 计数和上游对比,给出 changed / stashes / unpushed 三要素摘要。更严谨的是,如果检出目录自定义了 filter driver,disktree 直接放弃询问 git 状态显示"changes unknown"——因为它绝不允许执行一个目录自己指定的程序。连同 Worth a look 洞察模块(自动识别 30 天未动的僵尸实验目录、Agent worktree、可再生缓存,最小 64MB 才值得一行),整套产品把"找到、判断、删除、确认"变成了一个可审计的闭环。
框架红利期的新项目机会:disktree 提供了什么范本
disktree 最值得生态借鉴的,是它的分层架构。disktree-core 的文档注释写得很直白:尺寸核算、硬链接去重、长宽比布局、删除守卫这些"必须正确"的部分,可以在没有 GPUI、没有显示器、没有 GPU 的情况下编译和测试;disktree-app 则把所有界面动作收敛成状态机——"探索 / 审查 / 执行中 / 完成"四个 Screen,视图是状态的纯函数。
这个分层带来了两个红利:
一是可测试性。核心库用真实临时目录测试尺寸核算、布局和删除守卫;app 层用窗口 harness 测试真实绘制帧、真实按键事件,甚至有一条端到端测试:标记目录 → 确认删除 → 验证文件没了而邻居还在。
二是质量门禁。工作区Cargo.toml把clippy::all和clippy::pedantic全部设为 deny,nursery设为 warn,加上-D warnings让一切警告成为错误;每条例外都必须写下理由。AGENTS.md则充当开发者工作契约,把九条架构不变量(尺寸来自st_blocks × 512、总数由派生计算、标记按绝对路径持久化、瓦片用绝对 crumb 等)白纸黑字固定下来。
对后来者而言,这套模板的启示是:在框架早期,与其堆砌功能,不如把"正确性"做成产品差异。GPUI 的底层能力各家都一样,但能把删除安全、并发治理、主题跟随做进架构不变量里的应用,天然比"能跑的 demo"高一个段位。
风险:框架成熟度与跨平台成本仍然真实
但"第二个爆款"的叙事必须面对几个硬约束:
第一,GPUI 本身仍在快速变动。gpui-kit = "=0.6.6"的精确钉死,gpui-pre-macros还需要在 release profile 里单独开 debug-assertions(见根 Cargo.toml 的注释),都说明底层 API 还在演进。框架红利期意味着低竞争,但也意味着每个版本升级都可能是一场迁移。
第二,跨平台是持续成本而非一次性投入。仓库里有三套平台实现:macos.rs(用getattrlistbulk批量读取、识别 iCloud 降级目录避免触发云端下载)、windows.rs(目录列表附带分配大小与文件 ID)、mft.rs(MFT 直读),再加上 Linux 的/proc/self/mounts挂载表解析。每个平台还有自己的边界细节:macOS 需要 Full Disk Access 否则看不到邮件与回收站、未签名构建会被 Gatekeeper 拦截;Windows 的 MFT 路径需要管理员权限、受控文件夹访问会阻止卷刷新。这些在 README 中都有详尽交代,是实打实的维护负担。
第三,发行与信任渠道尚薄。disktree 目前主要通过 GitHub Release 压缩包、AUR(disktree与disktree-bin)和make install分发,macOS 侧还有签名公证流程。对比 WizTree、DaisyDisk 等成熟商业工具的存量用户习惯,一个纯键盘驱动的树图工具要"出圈",依赖的不仅是工程水平,还有生态内的口碑传播——而 GPUI 应用生态恰恰还没有形成规模化用户基础。
结语
回到标题的问题:disktree 会成为 GPUI 生态的第二个爆款吗?从仓库看,它具备了爆款的硬件条件——秒级性能(Rayon 并行 + 记忆化 + MFT 直读)、强产品差异(视觉编码 + 安全删除 + 键盘工作流)、可复制的工程质量(分层架构 + 严格门禁 + 窗口级测试)。而从生态看,它正站在一个罕见的窗口期:GPUI 从"Zed 的私有引擎"走向公共框架的早期,先发应用几乎没有同类竞争。
但爆款的"软件"——用户基数、发行渠道、框架稳定性——仍然悬而未决。disktree 与其说已经回答了这个问题,不如说它正在为整个 GPUI 生态做一次压力测试:如果连一个磁盘清理工具都能在 GPUI 上做到跨三平台、百万文件秒级扫描、删除行为可审计,那么下一个用 GPUI 造出爆款的开发者,手里拿到的就是一张已经被验证过的路线图。
【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust + GPUI.项目地址: https://gitcode.com/gh_mirrors/di/disktree
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考