重組檔案

當檔案寫入磁片時,有時檔案無法寫入連續叢集。 非連續叢集會讓讀取和寫入檔案的程式變慢。 磁片上非連續叢集的進一步是,問題更糟,因為移動硬碟的讀取/寫入前端所需的時間。 具有非連續叢集的檔案會 分散。 若要將檔案優化以快速存取,可以重組磁片區。

重組 是在磁片上移動部分檔案以重組檔案的程式,也就是移動磁片上的檔案叢集以使其連續的程式。 如需詳細資訊,請參閱下列各節:

重組檔案

在簡單的單一工作作業系統中,重組軟體是唯一的工作,而且沒有其他程式可讀取或寫入磁片。 不過,在多工作業系統中,某些進程可以讀取和寫入硬碟,而另一個進程正在重組該硬碟。 訣竅是避免對正在重組的檔案進行寫入,而不需要長時間停止寫入程式。 解決此問題並不簡單,但可能。

為了允許重組,而不需要檔案系統磁片結構的詳細知識,會提供一組三個控制程式代碼。 控制項代碼提供下列功能:

  • 讓應用程式找出空的叢集
  • 判斷檔案叢集的磁片位置
  • 移動磁片上的叢集

控制程式代碼也會透明地處理禁止問題,並允許其他進程在移動期間讀取和寫入檔案。

這些作業可以執行,而不需要禁止其他進程執行。 不過,當磁片磁碟機進行重組時,其他進程會有較慢的回應時間。

重組檔案

  1. 使用 FSCTL_GET_VOLUME_BITMAP 控制項程式碼,在磁片區上尋找足以接受整個檔案的位置。

    注意

    如有必要,請移動其他檔案,以建立夠大的位置。 在理想情況下,在檔案的第一個範圍之後有足夠的未配置叢集,您可以在第一個範圍之後將後續範圍移至空間。

     

  2. 使用 FSCTL_GET_RETRIEVAL_POINTERS 控制項程式碼來取得磁片上檔案目前配置的對應。

  3. 逐步解說 FSCTL_GET_RETRIEVAL_POINTERS 所傳回 的RETRIEVAL_POINTERS_BUFFER結構。

  4. 當您逐步執行結構時,請使用 FSCTL_MOVE_FILE 控制項程式碼來移動每個叢集。

    注意

    當其他進程寫入磁片時,您可能需要更新點陣圖或擷取結構,或同時更新兩者。

     

重組程式中使用的兩個作業需要磁片區的控制碼。 只有系統管理員可以取得磁片區的控制碼,因此只有系統管理員可以重組磁片區。 應用程式應該檢查嘗試執行重組軟體之使用者的許可權,如果使用者沒有適當的許可權,則不應該允許使用者重組磁片區。

使用 CreateFile 在 FAT 或 FAT32 檔案系統磁片區的重組期間開啟目錄時,請指定 GENERIC_READ 存取遮罩值。 請勿指定 MAXIMUM_ALLOWED 存取遮罩值。 如果完成,目錄的存取權會遭到拒絕。

請勿嘗試在超出叢集舍入檔案大小的 NTFS 檔案系統中移動配置的叢集,因為結果是錯誤。

重新剖析 NTFS 檔案系統磁片區中的點、點陣圖和屬性清單可以重組、開啟以供讀取和同步處理,並使用filenametype語法命名;例如,dirname:$i 30:$INDEX_ALLOCATION、mrp::$DATA、mrp::$REPARSE_POINT 和mrp::$ATTRIBUTE_LIST。

重組 NTFS 檔案系統磁片區時,允許將虛擬叢集重組超過檔案的配置大小。

將重組與陰影複製之間的互動降至最低

可能的話,在 16 (KB) 遞增中,以 16 KB 為單位,以彼此相對對齊的區塊移動資料。 這會在啟用陰影複製時減少寫入時的額外負荷,因為陰影複製空間會增加,而且發生下列情況時會降低效能:

  • 移動要求區塊大小小於或等於 16 KB。
  • 移動差異不會遞增 16 KB。

移動差異是來源區塊開頭與目標區塊開頭之間的位元組數目。 換句話說,如果 X 減 Y 的絕對值為 16 KB 的絕對值,則從位移 X 開始的區塊 (磁片上) 可以移至起始位移 Y。 因此,假設有 4 KB 的叢集,從叢集 3 移至叢集 27 將會優化,但從叢集 18 移至叢集 24 將不會。 請注意,mod (3,4) = 3 = mod (27,4) 。 選擇 Mod 4,因為每個叢集 4 KB 的四個叢集相當於 16 KB。 因此,格式化為 16 KB 叢集大小的磁片區會導致所有移動檔案都優化。

如需陰影複製的詳細資訊,請參閱 磁片區陰影複製服務

重組支援的檔案、資料流程和資料流程類型

雖然大部分的檔案都可以使用 FSCTL_MOVE_FILE 控制項程式碼來移動,但並非所有檔案都可以移動。 以下是FSCTL_MOVE_FILE支援的檔案、資料流程和資料流程類型清單, (也稱為屬性類型) 代碼。 FSCTL_MOVE_FILE不支援其他檔案、資料流程和資料流程類型。

任何檔案或目錄支援的資料流程類型。

  • ::$DATA
  • ::$ATTRIBUTE_LIST
  • ::$REPARSE_POINT
  • ::$EA
  • ::$LOGGED_UTILITY_STREAM

**Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:**:$EA 和 ::$LOGGED_UTILITY_STREAM 在 Windows 8 和 Windows Server 2012

任何目錄支援的資料流程類型。

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

以下是 「filenamestreamname:$typename」 格式FSCTL_MOVE_FILE支援的系統檔案、資料流程和資料流程類型。

  • $MFT::$DATA
  • $MFT::$ATTRIBUTE_LIST
  • $MFT::$BITMAP
  • $AttrDef::$DATA
  • $AttrDef::$ATTRIBUTE_LIST
  • $Secure:$SDS:$DATA
  • $Secure::$ATTRIBUTE_LIST
  • $Secure:$SDH:$INDEX_ALLOCATION
  • $Secure:$SDH:$BITMAP
  • $Secure:$SII:$INDEX_ALLOCATION
  • $Secure:$SII:$BITMAP
  • $UpCase::$DATA
  • $UpCase::$ATTRIBUTE_LIST
  • $Extend:$I 30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I 30:$BITMAP
  • $Extend\$UsnJrnl:$J:$DATA
  • $Extend\$UsnJrnl::$ATTRIBUTE_LIST
  • $Extend\$UsnJrnl:$Max:$DATA
  • $Extend\$Quota:$Q:$INDEX_ALLOCATION
  • $Extend\$Quota::$ATTRIBUTE_LIST
  • $Extend\$Quota:$Q:$BITMAP
  • $Extend\$Quota:$O:$INDEX_ALLOCATION
  • $Extend\$Quota:$O:$BITMAP
  • $Extend\$ObjId:$O:$INDEX_ALLOCATION
  • $Extend\$ObjId::$ATTRIBUTE_LIST
  • $Extend\$ObjId:$O:$BITMAP
  • $Extend\$Reparse:$R:$INDEX_ALLOCATION
  • $Extend\$Reparse::$ATTRIBUTE_LIST
  • $Extend\$Reparse:$R:$BITMAP
  • $Extend\$RmMetadata:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I 30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I 30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog:$I 30:$BITMAP
  • $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
  • $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog\$Tops:$T:$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST