Diskly 1.5.0 发版 —— 我做的 macOS 磁盘分析与清理工具

6 月 4 日
 mahui

大家好。我做了一个 macOS 原生的磁盘分析 + 清理工具 Diskly,今天发了 1.5.0,顺便来 V2 说几句。

为什么又造一个轮子

DaisyDisk / GrandPerspective 都用过。两件事我一直介意:

所以 Diskly 的几个产品决策都围绕这两点。

几件我较真的事

1. 数字必须诚实

2. 多入口起步,扫过的目录秒回

新建扫描页一屏装五种入口:拖拽 / ⌘O / 菜单 / Finder 服务 / 快速访问 + 最近扫描。

顶部的「 Pick up where you left off 」是 1.4.x 加的——扫过的结果还在内存里时,点一下秒回(无需重扫);多份结果按内存预算淘汰,当前这份永不淘汰。

3. 等待也该有信息

扫几百万文件需要时间,但进度条不该是空白的

1.5.0 里把扫描中页的下半区改了:加了一张实时构成图——按已识别字节的分类铺一张 mini 矩形树图,跟扫描结束后的总览同款配色。等待时已经能看到"占大头的是啥类型",体验连续。

实现细节:复用 Treemap.layout 的 squarified 算法,9 个分类桶合成成一棵浅层 FileNode 树喂进去布局。每帧重建 9 节点 + 一次 squarify,O(9) 极快不会成为热点。

4. 清理是有分寸的

清理建议分两轨:安全可删 / 建议检查。默认只勾安全的。

差异化的几个点:

并且每条建议都能展开看实际要删的文件清单,删前可以逐条核对、单独取消:

5. 克制,且只属于你

1.5.0 干了啥

这一版改动比较大,主要是性能 + UX 修复。挑几个有意思的说:

树图悬停帧率。之前 Canvas 同时画结构和高亮,鼠标每动一像素整张树图重绘 + 每个标签跑二分测量。拆成「结构层 + 高亮层」两层 Canvas,.equatable() 让 SwiftUI 在悬停时跳过结构层重渲染;标签宽度在 rebuild 时一次性 NSAttributedString.size() 二分截断好,绘制零度量。

下钻 /Applications 不再等几十秒。Spotlight 元数据查询从串行改 DispatchQueue.concurrentPerform 并发 + URL-keyed 会话缓存。200~500 个 app × 30~80ms 串行 = 6~40s,改并发后摊到核数,体感明显。

内存底座 −150 MBFileNode.idUUID()ObjectIdentifier(self)——900 万节点 × 16 字节 UUID 是纯开销,ObjectIdentifier 是 class 自带的零开销 identity,Identifiable 协议照样满足。

ETA 终于准了。旧算法用瞬时速率 EMA × 剩余字节,早期抖动剧烈、末期对小波动极敏感。改成「已用时间外推」:elapsed × (1 - fraction) / fraction,稳得多。同时单调钳制下降即时反映、上升每帧最多 +5s,避免视觉抖动;前 3 秒不显示(预热),整理阶段不显示。

ETA 文案 i18n 修复Formatting.duration 之前硬编码"秒/分/小时",英文模式下泄漏"2 分 48 秒"。改用 DateComponentsFormatter,按 locale 自动出"2m 48s"/"2 分 48 秒"。

菜单栏「偏好设置…」真能打开了。之前点了没反应——NSApp.sendAction(Selector(("showSettingsWindow:"))) 在 popover dismiss 同步链不可靠,SwiftUI Settings scene 的注入 target 找不到。新实现 DispatchQueue.main.async 让 popover 先彻底关闭,然后按 ⌘, 快捷键 递归找主菜单 item 直接 performActionForItem(等价于用户从 App 菜单点击)。

无默认邮件客户端兜底。这是 V2 提醒我考虑的:只用网页 Gmail / Outlook 的用户点 mailto 会失败。SupportContact.openOrCopyNSWorkspace.open,失败时复制邮箱到剪贴板 + 弹原生 alert;设置里每处邮箱旁加独立「复制」小按钮。

完整 changelog: https://diskly.app.mahui.me/changelog

怎么装

brew install --cask mahui/tap/diskly

或者官网 https://diskly.app.mahui.me 直接下 .dmg

Apple 公证 + 时间戳签名,Gatekeeper 直接放行,不用右键打开。要求 macOS 14 Sonoma+,Universal 二进制(Apple Silicon + Intel)。

价格

$9.99 一次买断,5 台设备激活。14 天全功能试用,试用结束才需要付费。

V2 老司机如果想体验完整版,私信我邮箱给一把激活码(几把够 V2er 用没问题)。

反馈

—— 昨天发了 Pier(菜单栏看端口/进程的小工具),今天又来打扰,如有问题欢迎拍。


技术栈:Swift + SwiftUI 原生,SPM 可执行文件(不是 Xcode 工程)。扫描器固定 worker 池 + 共享队列分治,实测扫 935 万文件的 / 大约 90s 左右,峰值内存 ~5 GB 。

2159 次点击
所在节点    分享创造
14 条回复
coronin
6 月 5 日
很好用
dabaov2
6 月 7 日
感觉 daisydisk 不太好用,除了比较直观外功能有点单一。想试用大佬的软件,可以给个码吗,感谢 ZGRkaW5nZGRkaW5nQDE2My5jb20=
bao626
6 月 7 日
大佬牛啊,膜~
defcc
6 月 7 日
我现在都是直接 codex ,让 codex 直接 "Clean my mac"
mahui
6 月 8 日
@defcc 👍
zhaoxixiangban
6 月 8 日
弟弟想要,弟弟能得到吗 ,已私信老哥。
mahui
6 月 8 日
@dabaov2 感谢反馈,激活码已发
mahui
6 月 8 日
zhaoxixiangban
6 月 8 日
试用了,真的不错扫盘很快(用过最快的) , 可能自动把大量代码的编译产物筛出来,统一清理很方便。 很好用啊
ffalex
7 月 27 日
1.定位竞品可能更偏向 burrow ( mole )。
2.可以考虑适当添加对其它类型项目中间文件的支持,比如 cargo 构建。
3.扫描选择目录无法搜索,进入具体目录才能搜索,也希望能支持模糊搜索。
就这么多,求个码~
mahui
7 月 27 日
@ffalex 谢了,三条都认真看了,2 和 3 已经在刚发的 1.8 里做掉了。

搜索那条你说得对。之前只有下钻进具体目录才出现搜索框,而且只匹配当前这一层——扫完停在顶层反而搜不了,这个设计确实别扭。1.8 改成结果页就带搜索框,范围是当前目录底下的整棵子树,命中按匹配度排序、点一下直接跳过去(文件会定位到所在目录并选中)。模糊匹配也加了,fzf 那一套:输 nmod 命中 node_modules ,输 ddata 命中 DerivedData ,中文也能搜。

构建产物顺着你提的 cargo 一起把几个生态补齐了:Cargo target 、Maven target 、Gradle build 、__pycache__ 归「安全可删」; CocoaPods Pods 和 Python 虚拟环境归「建议检查」——删了要重装依赖,不适合默认勾选。判定沿用原来的防误伤口径:target / build / Pods 这类常见目录名,必须旁边有 Cargo.toml / pom.xml / build.gradle / Podfile 才算数,光看名字不作数;虚拟环境要求目录里有 pyvenv.cfg 。这几类也跟 node_modules 一样受「近期活跃的 git 仓库自动排除」保护。

拿我自己的开发目录实测,补上这几类之后可释放量从 18 GB 变成 57 GB ,其中 cargo target 一项就占 32 GB 。这条建议含金量挺高,谢了。

留个邮箱,发码给你。完整改动在 https://diskly.app.mahui.me/changelog.html ,1.8 那两条都注明了是你的反馈。
ffalex
7 月 27 日
@mahui 感谢 bHlyaXNlZWtAaWNvdWQuY29t
mahui
7 月 27 日
@ffalex 你的邮箱应该是 icloud.com 吧?解码后是 icoud.com 。已发送到 icloud.com 邮箱。
ffalex
7 月 27 日
@mahui 已激活,就是这 key 有点随意了🐶
1.8 的模糊搜索结果不支持方向键移动选择,用着难受

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1218002

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX