重組檔案
當檔案寫入磁片時,有時檔案無法寫入連續叢集。 非連續叢集會讓讀取和寫入檔案的程式變慢。 磁片上非連續叢集的進一步是,問題更糟,因為移動硬碟的讀取/寫入前端所需的時間。 具有非連續叢集的檔案會 分散。 若要將檔案優化以快速存取,可以重組磁片區。
重組 是在磁片上移動部分檔案以重組檔案的程式,也就是移動磁片上的檔案叢集以使其連續的程式。 如需詳細資訊,請參閱下列各節:
重組檔案
在簡單的單一工作作業系統中,重組軟體是唯一的工作,而且沒有其他程式可讀取或寫入磁片。 不過,在多工作業系統中,某些進程可以讀取和寫入硬碟,而另一個進程正在重組該硬碟。 訣竅是避免對正在重組的檔案進行寫入,而不需要長時間停止寫入程式。 解決此問題並不簡單,但可能。
為了允許重組,而不需要檔案系統磁片結構的詳細知識,會提供一組三個控制程式代碼。 控制項代碼提供下列功能:
- 讓應用程式找出空的叢集
- 判斷檔案叢集的磁片位置
- 移動磁片上的叢集
控制程式代碼也會透明地處理禁止問題,並允許其他進程在移動期間讀取和寫入檔案。
這些作業可以執行,而不需要禁止其他進程執行。 不過,當磁片磁碟機進行重組時,其他進程會有較慢的回應時間。
重組檔案
使用 FSCTL_GET_VOLUME_BITMAP 控制項程式碼,在磁片區上尋找足以接受整個檔案的位置。
注意
如有必要,請移動其他檔案,以建立夠大的位置。 在理想情況下,在檔案的第一個範圍之後有足夠的未配置叢集,您可以在第一個範圍之後將後續範圍移至空間。
使用 FSCTL_GET_RETRIEVAL_POINTERS 控制項程式碼來取得磁片上檔案目前配置的對應。
逐步解說 FSCTL_GET_RETRIEVAL_POINTERS 所傳回 的RETRIEVAL_POINTERS_BUFFER結構。
當您逐步執行結構時,請使用 FSCTL_MOVE_FILE 控制項程式碼來移動每個叢集。
注意
當其他進程寫入磁片時,您可能需要更新點陣圖或擷取結構,或同時更新兩者。
重組程式中使用的兩個作業需要磁片區的控制碼。 只有系統管理員可以取得磁片區的控制碼,因此只有系統管理員可以重組磁片區。 應用程式應該檢查嘗試執行重組軟體之使用者的許可權,如果使用者沒有適當的許可權,則不應該允許使用者重組磁片區。
使用 CreateFile 在 FAT 或 FAT32 檔案系統磁片區的重組期間開啟目錄時,請指定 GENERIC_READ 存取遮罩值。 請勿指定 MAXIMUM_ALLOWED 存取遮罩值。 如果完成,目錄的存取權會遭到拒絕。
請勿嘗試在超出叢集舍入檔案大小的 NTFS 檔案系統中移動配置的叢集,因為結果是錯誤。
重新剖析 NTFS 檔案系統磁片區中的點、點陣圖和屬性清單可以重組、開啟以供讀取和同步處理,並使用file:name:type語法命名;例如,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
以下是 「filename:streamname:$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