实时监控
SpaceKnife 的扫描结果不是一张会过期的照片。标签开着的时候,SpaceKnife 一直监视扫描过的位置,把每一处变化合并进树里:越下越大的文件、刚删掉的构建目录、刚装好的游戏更新。树图、详情面板、可用空间和删除篮都会自己跟上。
监控和扫描同时开始,扫描还没结束时发生的变化也不会丢;关闭标签时停止。打开的快照从不监控:它本来就是过去的状态。
变化长什么样
Section titled “变化长什么样”- 闪烁:内容变了的块闪两下,然后淡出。变化的项太小、没有自己的块时,闪的是包含它的那个块。
- 静态角标:打开「减少动画」(设置 › 外观 › 动画)后不再闪烁,改为在块上写出大小的变化,例如
+212 MB、−1.2 GB,停留约 10 秒;块里放得下才显示。 - 其他数字一起变:所有上级文件夹的大小、可用空间与未知空间块、状态栏的可用空间(最多每秒重读一次)、删除篮里的大小都随之更新。
想完全不闪,关掉「元素变化闪烁」(设置 › 可视化 › 变化提示)。这个开关同时控制扫描中文件夹的呼吸描边。
状态栏里的实时监控一项显示当前标签的监控状态。悬停看详情,单击开关实时监控。
| 状态栏显示 | 含义 |
|---|---|
| 实时监控中 | 每个扫描过的文件夹都由系统的变化通知监视。提示里是已应用的变化数(「{n} 处变化已更新」)和还在排队的数量(「{pending} 项待处理」)。 |
| 实时监控 · 启动中 | 正在建立监视(FSEvents 可能要稍等片刻)。 |
| 实时监控 · 部分轮询 | 部分或全部文件夹改用轮询。提示里写着原因,例如「inotify 监视额度不足,{count} 个文件夹改为轮询」。 |
| 实时监控 · 失败 | 监视已停止。提示里写着原因,例如「监视的文件夹已被删除」。 |
| 实时监控已关闭 | 实时监控是关着的。 |
| 快照 · 不监控变化 | 这个标签显示的是快照。 |
| 实时监控 · 扫描后自动开启 | 这个标签还没有扫描,实时监控是开着的。 |
各平台的机制
Section titled “各平台的机制”SpaceKnife 选系统能提供的最好的机制,用不了时退回轮询。监视器只负责报告「哪里变了」;新增、删除、改名这类结构变化,一律重新列出所在文件夹得到准确结果,所以树最终和磁盘上一致。
Windows
Section titled “Windows”- 每个扫描根一个递归的
ReadDirectoryChangesExW监视。它的扩展信息自带文件的新大小、占用和修改时间,所以文件变大时原地更新,不用再读一次磁盘。 - 不提供扩展信息的卷或文件系统退回
ReadDirectoryChangesW,这时大小变化要重新列出文件夹才能得到。 - 系统的通知缓冲区溢出意味着丢了事件。如果已提权的扫描助手已经在运行(MFT 快速扫描启动过它),SpaceKnife 从最近的检查点读取 NTFS 的 USN 变更日志,只重新列出真正被动过的文件夹;否则把受影响的子树重新读一遍。SpaceKnife 不会为了监控而请求管理员权限。
- 扫描根被删除、移动或改名时,这个根的监控停止,显示「失败」。
- 每个文件夹一个
inotify监视。新文件夹一出现就加上监视并立即读取内容,所以「mkdir 后马上写入」或整棵目录树移进来都不会漏。 - 所有打开的扫描共用
fs.inotify.max_user_watches的 80% 作为额度,超出额度的文件夹改为轮询,状态栏显示「部分轮询」。 - 网络文件系统(NFS、SMB)和 WSL 下的 Windows 盘始终轮询:别的机器(或 Windows)做的改动,内核根本收不到通知。
- 内核的事件队列溢出时,SpaceKnife 等安静下来后把监视的树重新读一遍,丢失的事件不会被悄悄忽略。
- 每个扫描根一个
FSEvents事件流。系统报告丢了事件时,重新读取受影响的文件夹。 - FSEvents 启动不了时改为轮询。
轮询是所有平台的兜底:每 30 秒比对一轮各文件夹的修改时间,每秒最多检查 2000 个文件夹,保持很轻的后台负载。
变化如何应用
Section titled “变化如何应用”- 合并:事件攒到「事件合并间隔」(默认 150 ms)内没有新事件时一起处理;事件一直不停时,也至少每秒处理一次。
- 更新:大小或时间变了的文件原地更新;条目变了的文件夹用扫描的同一套代码重新列出一层;新出现的文件夹接着扫描。
- 事件风暴:一批要动的文件夹超过 2000 个或事件超过 20000 条时(解压大压缩包、大规模
git checkout),SpaceKnife 不再逐条追,而是标记它们共同的文件夹,安静 2 秒后整体重新读取。日志面板(Ctrl+J)里会记一条「文件变化过多」。 - 扫描进行中:扫描还没读到的文件夹里的变化,交给扫描自己读到;MFT 快速扫描期间,所有变化等整棵树就绪(几秒)后再应用。
手动重新扫描
Section titled “手动重新扫描”实时监控开着时很少需要,但想确认结果、关掉了监控、或轮询漏掉了大小变化时可以用。
| 操作 | 方法 | 读取范围 |
|---|---|---|
| 重新扫描此文件夹 | 右键 › 「重新扫描此文件夹」 | 这个文件夹及其下全部内容;对文件则是它所在的文件夹。 |
| 重新扫描当前视图 | 命令面板(Ctrl+K)›「重新扫描当前视图」 | 当前放大进入的文件夹及其下全部内容。 |
| 全盘重新扫描 | 命令面板 ›「全盘重新扫描」 | 在同一个标签里重新扫描同样的位置。 |
- 文件夹的重新扫描立即开始(不等安静期),实时监控关闭时也能用。
- 重新扫描后有变化的块照常闪烁。
- 标签里的扫描还在进行时,不能重新扫描文件夹:「扫描进行中,完成后再重新扫描」。
继续已停止的扫描
Section titled “继续已停止的扫描”硬扫描中途停止后,已扫描的结果保留,没读到的文件夹也记着。状态栏会出现「继续扫描」(提示:「还有 {n} 个文件夹没有读取」)。单击它,或在命令面板里运行「继续已停止的扫描」,扫描就从停下的地方接着读;读完后像其他完成的扫描一样保存为快照。
只有硬扫描可以继续。MFT 快速扫描几秒就完成,没有可以继续的部分。
| 设置 | 位置 | 默认 | 作用 |
|---|---|---|---|
| 实时监控 | 扫描与性能 › 实时监控 | 开 | 监视打开的扫描。和状态栏那一项是同一个开关。 |
| 事件合并间隔 | 扫描与性能 › 实时监控 | 150 ms | 此时间内的连续变化合并为一次刷新(50–5000 ms)。某个文件夹一直在变、树图忙个不停时可以调大。 |
| 元素变化闪烁 | 可视化 › 变化提示 | 开 | 变化的块闪烁(或显示角标)。 |
| 减少动画 | 外观 › 动画 | 跟随系统 | 开:用静态角标代替闪烁。 |
Ctrl+, 打开设置,完整列表见设置。