我有数百张照片文件,它们被无意中从一个 Windows NTFS 格式的压缩外部驱动器移动到了另一个由 Mac OS X 格式化的外部驱动器。移动是在 Mac OS X 操作系统下进行的。不幸的是,文件移动过程完成时,Windows 文件系统并未“解压”所有原始文件。
有谁知道有什么恢复服务、应用程序或手动转换方法可以让我恢复这些照片文件吗?现在这些照片文件都被视为“损坏的” JPG 和 RAW 文件。如果您能提供任何帮助或建议,我将不胜感激。
答案1
NTFS 压缩由文件元数据中的标志指示,该标志存储在主文件表 (MFT) 中。直接设置它很困难,因为通常当您更改该标志时,文件系统驱动程序会为您压缩或解压缩文件。您可能可以手动添加此标志 - 它只是文件属性 DWORD 中的一个位 - 但直接破解 MFT 可能不是最好的方法。相反,请尝试以下操作:
- 在 NTFS 卷(如果使用 NTFS 格式化,则可能是闪存驱动器)上,创建一个(或一组)压缩文件(使用 Windows)。为了便于说明,我们将这些文件称为
rescue1
、rescue2
等。 - 将 NTFS 驱动器连接到 Mac 系统(无需先解压文件)。以读/写方式挂载卷。假设它挂载在
/mount/ntfs
(我实际上没有使用过 OS X,所以记不住它挂载外部卷的位置)。 - 使用复制文件的工具内容,例如命令行实用程序
dd
,将压缩的无元数据文件的内容复制到 NTFS 卷上的压缩文件的内容中。命令类似于dd if=/path/to/bad/file of=/mount/ntfs/rescue1 bs=4M
。 - 将驱动器重新连接到 Windows,看看现在是否可以正确打开压缩文件。如果可以,您可以安全地让 Windows 解压缩它们(就地解压缩,或复制到不支持压缩的驱动器,如 FAT32 闪存驱动器)。
- 如果此方法有效,您可以使用它来拯救数百个文件。只需在 NTFS 驱动器上创建所需的压缩文件,以任何您认为最好的方式命名它们(可以是原始名称),然后从 Mac 复制内容。
请注意,您不必压缩整个 NTFS 卷;这只会导致所有目录继承“压缩”标志,并且每个文件都会从文件目录继承该标志。不过,这样做也没什么坏处。
不过,我确实建议使用备份或一次性 NTFS 卷;如果 OS X NTFS 驱动程序太差,则当您尝试写入 Windows 卷时它可能会损坏 MFT。
如果上述方法不起作用,则采用更复杂的替代方法:
- 在 Windows 上创建一堆压缩文件。困难的部分是它们需要与坏文件的大小匹配。如果你想挽救一个大小为 30913 字节的文件,你需要压缩NTFS 文件在压缩后达到该大小。说实话,我不知道该如何安排。至少,让救援文件至少大小(在磁盘上)与需要救援的文件大小相同。最好使大小在 4k 以内,因为这是 NTFS 簇(用于文件数据的分配块)的默认大小。
- 使用
fsutil
Windows 中的实用程序获取范围救援文件。范围是文件数据在分区中存储的卷上的实际偏移量。- 该命令是
fsutil file queryextents <filename>
,并且根据位置,您可能需要以管理员身份运行它。 - 该命令的输出如下所示:
VCN: 0x0 Clusters: 0x2 LCN: 0x48000
。这说明该文件占用两个集群,逻辑簇号0x48000(偏移量 4096*0x48000=1207959552)到卷偏移量 0x48001,总空间为 8k(2 x 4k/簇)。实际上,末尾通常是未使用的空间。 - 可能会有多行输出(当文件碎片化时会发生这种情况;如果在创建下一个文件之前先调整每个文件的大小,则不太可能在新格式化的卷上发生这种情况)。第一个值(虚拟簇号) 在后续行中将不会为零,它将是文件内该范围开始的偏移量(以簇为单位)(例如,如果它是 0x3,则表示范围从文件的 12k 开始)。
- 该命令是
- 断开驱动器并连接到 OS X。不是这次安装卷。相反,找到正确的卷标识符。在 Linux 上,这将是类似
/dev/sdb1
。(第二个驱动器 -> sdb1、第一个分区 -> sdb1)。 - 使用
dd
,将损坏的压缩文件直接复制到原始卷中。- 例如,假设您的文件有两个范围:
VCN: 0x0 Clusters: 0x15 LCN: 0x13c
VCN: 0x15 Clusters: 0x3f6 LCN: 0xab20
- 您可以使用以下命令来
dd
,并根据需要调整文件名。请参阅dd 手册页了解更多信息,但现在请注意,所有参数都dd
方便地为块大小的倍数(bs
param),但十六进制值已转换为十进制(不确定是否dd
能正确处理十六进制;一些类似 dd 的程序可以,但不是全部):dd if=/path/to/bad/file of=/dev/sdb1 bs=4K count=21 seek=316
dd if=/bath/to/bad/file of=/dev/sdb1 bs=4k count=1014 seek=337 skip=21
- 例如,假设您的文件有两个范围:
- 将文件数据复制到原始分区后,您应该能够将驱动器连接到 Windows 并读取压缩(恢复)文件。如果文件大小不完全匹配,那么您可能会发现文件末尾有一些垃圾,但希望这不会成为问题。
另一种方法(可能更简单,甚至很多更简单的方法是找到ntfs-3g
处理 NTFS 解压缩的例程。直接在文件上运行该例程。或者,看看您是否可以找到该ntfsdiskedit
实用程序的副本(似乎已停用),看看您是否可以在将文件(作为未压缩文件)复制到 NTFS 卷后使用它来手动设置文件的“压缩”位。