对文件进行碎片整理

将文件写入磁盘时,有时无法以连续群集写入文件。 非连续群集会减慢读取和写入文件的过程。 在磁盘上,非连续群集的进一步区别在于,问题越糟,因为移动硬盘驱动器的读/写头所需的时间。 具有非连续群集的文件已 分段。 若要优化文件以便快速访问,可以对卷进行碎片整理。

碎片整理 是将磁盘上的文件部分移动到碎片整理文件的过程,即在磁盘上移动文件群集以使其连续的过程。 有关详细信息,请参阅以下各节:

对文件进行碎片整理

在简单的单任务操作系统中,碎片整理软件是唯一的任务,没有其他进程可以读取或写入磁盘。 但是,在多任务操作系统中,某些进程可以读取和写入硬盘驱动器,而另一个进程正在对硬盘驱动器进行碎片整理。 此技巧是避免对正在碎片整理的文件进行写入,而无需长时间停止写入过程。 解决此问题并不微不足道,但有可能。

若要在不要求详细了解文件系统磁盘结构的情况下进行碎片整理,提供了一组三个控制代码。 控件代码提供以下功能:

  • 使应用程序能够查找空群集
  • 确定文件群集的磁盘位置
  • 在磁盘上移动群集

控制代码还透明地处理抑制问题,并允许其他进程在移动期间读取和写入文件。

可以执行这些操作,而不会阻止其他进程运行。 但是,在对磁盘驱动器进行碎片整理时,其他进程具有较慢的响应时间。

对文件进行碎片整理

  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 千字节为单位的块中移动数据。 这减少了启用卷影副本时复制时写入开销,因为卷影复制空间增加,在发生以下情况时性能会降低:

  • 移动请求块大小小于或等于 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

以下是 FSCTL_MOVE_FILE 以“filenamestreamname:$typename”格式支持的系统文件、流和流类型。

  • $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