先理解 NTFS 是怎么记账的
NTFS 文件系统里有一本“总账”,叫主文件表(Master File Table,MFT)。你在硬盘上存的每一个文件、每一个文件夹,在 MFT 里都对应一条几百字节到 1 KB 左右的记录:文件名、大小、时间戳、在磁盘上的位置,全在这一条里。
也就是说,文件的全部元数据其实集中存放在一个连续的结构里。想知道“整个盘有什么、各占多大”,理论上把这本账翻一遍就够了。
传统工具的笨办法
WinDirStat、SpaceSniffer 这类工具走的是 Windows 提供的标准文件接口:向系统询问“这个目录下有什么”,得到一批文件和子目录,再对每个子目录重复询问……目录树有多深、有多密,就要问多少万次。每次询问都有系统调用开销,机械硬盘上磁头还要来回寻道,时间就这么耗掉了。
WizTree 的做法:直接读账本
WizTree 拿到管理员权限后,把 MFT 文件整块读进内存,自己解析里面的记录,一次顺序读取就拿到了全盘每个文件的元数据。这带来三个数量级的效率差:
- 顺序读 vs 随机寻道:MFT 基本连续存放,一次大块读入;逐目录遍历则是大量随机访问
- 一次解析 vs 百万次询问:几十万条记录在内存里毫秒级处理完
- 不碰文件内容:只读元数据,不管文件本体多大
所以机械硬盘上的差距最夸张——HDD 最怕随机寻道,恰好是传统遍历的主成本。
直读带来的三个实际影响
1. 必须管理员权限 读 MFT 属于底层磁盘访问,普通用户进程没资格。不提权时 WizTree 退回标准接口模式,速度立刻“泯然众人”。
2. 只对 NTFS 生效 MFT 是 NTFS 特有的。U 盘、老移动硬盘常见的 FAT32/exFAT 没有这个结构,WizTree 在这些分区上自动使用常规扫描,速度与同类工具持平。
3. 数字可能和资源管理器略有出入 MFT 记录的是文件系统层面的“分配大小”,资源管理器统计的是“占用大小”,对稀疏文件、压缩文件两者会有小差异。做空间分析够用,不必纠结几 MB 的出入。
顺便说:为什么读取 MFT 是安全的
只读解析、不做任何写入,MFT 本身受操作系统保护,普通应用改不了它。杀毒软件偶尔对这类底层读取给启发式提示,属于对“行为敏感”而非“发现恶意”,从官网下载并校验数字签名即可放心。
理解原理后,扫描很慢的排查方法这篇文章里的每一条对策就都好懂了。