对文件进行碎片整理
将文件写入磁盘时,有时无法在连续群集中写入文件。 非连续群集会减缓读取和写入文件的过程。 由于移动硬盘驱动器的读/写头所需的时间,非连续群集在磁盘上距离越远,问题越糟糕。 具有非连续群集的文件已碎片化。 若要优化文件以便快速访问,可以对卷进行碎片整理。
碎片整理是移动磁盘上文件部分以对文件进行碎片整理的过程,即在磁盘上移动文件群集以使它们连续的过程。 有关详细信息,请参阅以下各节:
对文件进行碎片整理
在简单的单任务操作系统中,碎片整理软件是唯一的任务,没有其他进程会读取或写入磁盘。 但是,在多任务操作系统中,在有进程正在对硬盘驱动器进行碎片整理时,某些进程可以读取和写入硬盘驱动器。 技巧是避免写入正在进行碎片整理的文件,这样就不会长时间停止写入进程。 解决此问题并非小事,但有可能解决。
为了在无需详细了解文件系统磁盘结构的情况下进行碎片整理,系统提供了一个含三个控制代码的代码集。 控制代码提供以下功能:
- 使应用程序能够找到空群集
- 确定文件群集的磁盘位置
- 在磁盘上移动群集
控制代码还会透明地处理禁止和允许其他进程在移动期间读取和写入文件的问题。
可以执行这些操作,而不会禁止其他进程运行。 但是,正在对磁盘驱动器进行碎片整理时,其他进程响应时间会较慢。
若要对文件进行碎片整理,请执行以下操作:
- 使用 FSCTL_GET_VOLUME_BITMAP 控制代码在大到足以接受整个文件的卷上找到一个位置。
注意
如有必要,移动其他文件,以创建足够大的位置。 理想情况下,在文件的第一个盘区之后具有足够的未分配群集,可以将后续盘区移到第一个盘区之后的空间中。
使用 FSCTL_GET_RETRIEVAL_POINTERS 控制代码获取磁盘上文件的当前布局的映射。
浏览 FSCTL_GET_RETRIEVAL_POINTERS 返回的 RETRIEVAL_POINTERS_BUFFER 结构。
使用 FSCTL_MOVE_FILE 控制代码在浏览结构时移动每个群集。
注意
可能需要续订位图或检索结构,或者在其他进程写入磁盘时在各个时间同时续订这两者。
碎片整理进程中使用的两个操作需要卷的句柄。 只有管理员才能获取卷的句柄,因此只有管理员才能对卷进行碎片整理。 应用程序应检查尝试运行碎片整理软件的用户的权限,如果用户没有适当的权限,则不会允许用户对卷进行碎片整理。
在对 FAT 或 FAT32 文件系统卷进行碎片整理期间,使用 CreateFile 打开目录时,指定 GENERIC_READ 访问掩码值。 不要指定 MAXIMUM_ALLOWED 访问掩码值。 如果这样做,则拒绝目录访问。
不要尝试在超出群集舍入文件大小的 NTFS 文件系统中移动分配的群集,因为结果是错误。
可以对 NTFS 文件系统卷中的点、位图和属性列表重新分析、打开进行读取和同步,以及使用 file:name:type 语法进行命名;例如 dirname:$i30:$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:$I30:$INDEX_ALLOCATION
- $Extend::$ATTRIBUTE_LIST
- $Extend:$I30:$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:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata:$I30:$BITMAP
- $Extend\$RmMetadata::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair::$DATA
- $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Repair:$Config:$DATA
- $Extend\$RmMetadata\$Txf:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$Txf:$I30:$BITMAP
- $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
- $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
- $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
- $Extend\$RmMetadata\$TxfLog:$I30:$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