NTFS 檔案壓縮問題

NTFS 檔案壓縮問題

我有數百個照片檔案被無意中從 Windows NTFS 格式的壓縮外部磁碟機移動到由 Mac OS X 格式化的第二個外部磁碟機。不幸的是,檔案移動過程完成後,所有原始檔案都沒有被 Windows 檔案系統「解壓縮」。

有誰知道任何恢復服務、應用程式或手動轉換方法可以讓我恢復這些照片文件,所有這些文件現在都被視為「損壞的」JPG 和 RAW 文件?如果您能提供任何幫助或建議,我們將不勝感激。

答案1

NTFS 壓縮由檔案元資料中的標誌指示,該標誌儲存在主檔案表 (MFT) 中。直接設定它很困難,因為通常當您更改該標誌時,檔案系統驅動程式將為您壓縮或解壓縮檔案。您可能可以手動新增此標誌 - 它只是檔案屬性 DWORD 中的一個位元 - 但直接破解 MFT 可能不是最好的方法。相反,請嘗試以下操作:

  1. 在 NTFS 磁碟區(可以是快閃磁碟機,如果使用 NTFS 對其進行格式化)上,建立一個(或一堆)壓縮檔案(使用 Windows)。為了方便說明,我們將這些文件稱為rescue1rescue2等。
  2. 將 NTFS 磁碟機連接到 Mac 系統(無需先解壓縮檔案)。安裝讀/寫卷。假設它安裝在/mount/ntfs(我實際上並沒有充分使用 OS X 來記住它安裝外部磁碟區的位置)。
  3. 使用複製文件的工具內容,例如命令列實用程序dd,將無元資料壓縮檔案的內容複製到 NTFS 磁碟區上的壓縮檔案的內容中。該命令類似於dd if=/path/to/bad/file of=/mount/ntfs/rescue1 bs=4M.
  4. 將磁碟機重新連接到 Windows,然後查看現在是否可以正確開啟壓縮檔案。如果可以,您就可以安全地讓 Windows 解壓縮它們(就地解壓縮,或複製到不支援壓縮的磁碟機(如 FAT32 隨身碟))。
  5. 如果此方法有效,您可以使用它來挽救所有數百個文件。只需根據需要在 NTFS 驅動器上建立盡可能多的壓縮文件,以任何看起來最好的方式命名它們(可以是原始名稱),然後從 Mac 複製內容。

請注意,您不必壓縮整個 NTFS 磁碟區;只需壓縮即可。這只會導致所有目錄繼承“壓縮”標誌,並且每個檔案從檔案的目錄繼承它。不過,這樣做也沒什麼不好。

不過,我確實建議使用備份或一次性的 NTFS 磁碟區;如果 OS X NTFS 驅動程式那麼糟糕,當您嘗試寫入 Windows 磁碟區時,它可能會損壞 MFT。

如果上述方法不起作用,則更複雜的替代方法:

  1. 在 Windows 上建立一堆壓縮檔案。困難的部分是它們需要匹配壞文件的大小。如果你想拯救一個大小為 30913 位元組的文件,你將需要壓縮的NTFS 檔案壓縮後的大小。我會說實話;我不知道如何安排。至少,製作救援文件至少需要救援的檔案的大小(在磁碟上)。使大小匹配在 4k 以內是最好的,因為這是 NTFS 簇的預設大小(用於檔案資料的分配區塊)。
  2. 使用fsutilWindows 中的實用程式來取得範圍的救援文件。範圍是分區中儲存檔案資料的磁碟區上的實際偏移。
    • 該命令是fsutil file queryextents <filename>,根據位置,您可能需要以管理員身份執行它。
    • 該命令的輸出看起來像這樣:VCN: 0x0 Clusters: 0x2 LCN: 0x48000。這就是說該檔案佔用兩個簇,邏輯簇號0x48000(偏移量 4096*0x48000=1207959552)到卷偏移量 0x48001,總空間為 8k(2 x 4k/集群)。實際上,其末端通常是未使用的空間。
    • 可能有多行輸出(當檔案碎片化時會發生這種情況;如果在建立下一個檔案之前調整每個檔案的大小,則在新格式化的磁碟區上不太可能發生這種情況)。第一個值(虛擬簇數)在後續行中不會為零,它將是該範圍開始的文件內的偏移量(以簇為單位)(例如,如果它是 0x3,則意味著該範圍從文件中的 12k 開始)。
  3. 斷開驅動器並連接到 OS X。不是這次安裝卷。相反,找到正確的磁碟區標識符。在 Linux 上,這類似於/dev/sdb1. (第二個磁碟機 -> sd1、第一個分區->sdb1)。
  4. 使用dd,將錯誤的壓縮檔案直接複製到原始磁碟區。
    • 例如,假設您的文件有兩個範圍:
      • VCN: 0x0 Clusters: 0x15 LCN: 0x13c
      • VCN: 0x15 Clusters: 0x3f6 LCN: 0xab20
    • 您可以使用以下命令dd,並根據需要調整檔案名稱。請參閱dd 線上說明頁有關更多信息,但現在請注意,所有參數都可以dd方便地採用塊大小(bsparam )的倍數,但十六進制值已轉換為十進制(不確定是否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
  5. 將檔案資料複製到原始分割區後,您應該能夠將磁碟機連接到 Windows 並讀取壓縮(救援)檔案。如果檔案大小不完全匹配,那麼您可能會發現文件末尾有一些垃圾,但希望這不會成為問題。

另一種方法(可能更容易,甚至很多更容易)的方法是找到ntfs-3g處理 NTFS 解壓縮的程式。直接在文件上運行該例程。或者,查看是否可以找到該實用程式的副本ntfsdiskedit(似乎已停止使用),並查看是否可以在將檔案(作為未壓縮檔案)複製到 NTFS 磁碟區後使用它來手動設定檔案上的「壓縮」位元。

相關內容