重組檔案
將檔案寫入磁碟時,有時無法以連續叢集寫入檔案。 非連續叢集會減緩讀取和寫入檔案的程式。 磁碟上非連續叢集的進一步分開,問題愈嚴重,因為移動硬碟讀取/寫入前端所需的時間。 具有非連續叢集的檔案已 分散。 若要將檔案優化以快速存取,可以重組磁碟區。
重組是移動磁碟上檔案部分以重組檔案的程式,也就是在磁碟上移動檔案叢集以使其連續的程式。 如需詳細資訊,請參閱以下章節:
重組檔案
在簡單的單一工作操作系統中,重組軟體是唯一的工作,而且沒有其他程式可讀取或寫入磁碟。 不過,在多任務操作系統中,某些進程可以在另一個程式重組該硬碟時,從硬碟讀取和寫入硬碟。 訣竅是避免寫入正在重組的檔案,而不需要長時間停止寫入程式。 解決這個問題並非微不足道,但有可能。
若要允許重組,而不需要文件系統磁碟結構的詳細知識,則會提供一組三個控制程序代碼。 控制項代碼提供下列功能:
- 讓應用程式找出空的叢集
- 判斷檔案叢集的磁碟位置
- 移動磁碟上的叢集
控制程式代碼也會透明地處理抑制問題,並允許其他進程在移動期間讀取和寫入檔案。
您可以執行這些作業,而不會禁止其他進程執行。 不過,當磁碟驅動器正在重組時,其他進程會有較慢的響應時間。
若要重組檔案:
- 使用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。
移動差異是來源區塊開頭與目標區塊開頭之間的位元元組數目。 換句話說,如果 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