Skip to content
NTFS2exFAT

NTFS2exFAT 的工作原理

共五个阶段,并且绝不跳过任何一个。本页说明在每一步你的数据会发生什么,以及有哪些检查在帮你防止失误。

五个阶段

1. 检查硬盘(只读)

应用在不做任何改动的情况下扫描硬盘。它统计文件和文件夹数量,标出 exFAT 不允许的名称,跳过 System Volume Information 和 $RECYCLE.BIN 等系统文件夹,并把硬盘报告的已用空间与 macOS 实际能看到的文件做对比。差距过大就是警告,说明部分数据可能对 macOS 不可见。

  • 不会向硬盘写入任何内容
  • 无法读取的项目会被列出,而不是悄悄跳过
  • 你会看到需要多少备份空间

2. 带校验和的备份

文件被复制到你选择的文件夹。复制每个文件的同时计算其 SHA-256。进度保存在只追加的清单(manifest)中,因此你可以暂停、退出并继续。

  • 备份不能放在将被擦除的硬盘上
  • 备份路径会避免在不区分大小写的卷上发生冲突
  • 文件先以临时名称写入,完成后才重命名

3. 校验备份

每个备份文件都绕过缓存从磁盘重新读取,并把其校验和与根据原文件计算的校验和比对。哪怕只有一个字节变化,校验也会失败。

  • 读取来自磁盘,而不是内存
  • 任何失败都会在格式化步骤之前终止流程

4. 受保护的擦除

只有以下条件全部满足,才能进行格式化:备份已完全校验;备份文件仍然存在且大小正确;硬盘的卷身份、磁盘身份和大小仍与之前一致;备份不在该硬盘上;并且你输入了准确的硬盘名称。应用会在动硬盘之前先记录“即将擦除”,这样即使被中断,之后也能识别出来。

  • 只提供外接硬盘
  • 格式化命令针对的正是已备份的那个卷
  • 如果格式化需要权限,macOS 会向你询问

5. 拷回并校验

所有文件被复制到新的 exFAT 卷,并再次读取以比对校验和。exFAT 不允许的名称会被重命名并列出。最终报告保存在备份旁边。

  • 损坏的备份文件绝不会被复制到新硬盘
  • 备份会保留,直到你自己删除

这里的“已校验”是什么意思

当一个文件写入后从硬盘读回的内容,计算出的 SHA-256 与原文件相同,才算已校验。应用不会仅凭文件大小或日期来判断。唯一的例外是名为 ._* 的 macOS 元数据文件:复制到 exFAT 后,macOS 会把它们合并为扩展属性,因此只能确认已写入,无法重新读取校验。

文件名与元数据

exFAT 不允许使用字符 " * : < > ? \ |、控制字符,以及以空格或点结尾的名称。这类名称会被替换并列入报告。仅大小写不同的名称会被改为唯一的名称。文件和文件夹的修改日期会被保留。

如实说明的局限

macOS 内置的 NTFS 读取器可能隐藏或重命名名称不被 Windows 允许的文件。NTFS2exFAT 只能处理 macOS 呈现给它的内容。当硬盘的已用空间远大于可见文件时它会发出警告,但无法检测出某一个被隐藏的文件。如果你的硬盘是由 Mac 或 Linux 的 NTFS 驱动写入的,请在转换之前,先在 Windows 中或用基于 ntfs-3g 的驱动(如 NTFSTool)检查。

技术内幕

转换引擎是一个小型 Swift 库,除 Foundation 和 CryptoKit 外没有其他依赖。Mac 应用和命令行工具共用同一个引擎。

  • 清单(Manifest):每个文件一行 JSON,包含路径、大小、校验和与状态
  • 复制:4 MiB 缓冲区,无缓存读写,fsync,原子重命名
  • 并发:多个文件同时处理,每个工作线程同一时间只处理一个大文件
  • 安全检查位于引擎之中,因此应用和命令行执行的是同样的规则

测试情况

引擎有单元测试(其中包括一个测试:在已校验的备份中翻转一个字节,并要求校验失败),也有端到端测试:构建真实的 NTFS 磁盘镜像,运行完整转换,并用 SHA-256 比对每个还原的文件。在实体外接硬盘上的测试仍在进行,这也是目前仍是测试版的原因之一。

更喜欢命令行?

同一个引擎也提供为 ntfs2exfat-cli。

ntfs2exfat-cli list
ntfs2exfat-cli start disk4 ~/Backups
ntfs2exfat-cli backup ~/Backups/NTFS2exFAT-<job>
ntfs2exfat-cli erase ~/Backups/NTFS2exFAT-<job> --confirm "MY DRIVE"
ntfs2exfat-cli restore ~/Backups/NTFS2exFAT-<job>

GitHub 源码 →

准备好转换你的硬盘了吗?