对文件进行碎片整理

将文件写入磁盘时,有时无法在连续群集中写入该文件。 非连续群集会减慢读取和写入文件的过程。 由于移动硬盘驱动器的读/写头所需的时间,非连续群集在磁盘上的距离越远,问题就越严重。 具有不连续群集的文件是 分段的。 若要优化文件以便快速访问,可以对卷进行碎片整理。

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

对文件进行碎片整理

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

为了允许在无需详细了解文件系统磁盘结构的情况下进行碎片整理,我们提供了一组三个控制代码。 控制代码提供以下功能:

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

控制代码还以透明方式处理在移动过程中禁止和允许其他进程读取和写入文件的问题。

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

对文件进行碎片整理

  1. 使用 FSCTL_GET_VOLUME_BITMAP 控制代码在卷上查找一个足以接受整个文件的位置。

    注意

    如有必要,请移动其他文件以创建足够大的位置。 理想情况下,文件的第一个盘区之后有足够的未分配群集,可以将后续盘区移到第一个盘区后的空间中。

     

  2. 使用 FSCTL_GET_RETRIEVAL_POINTERS 控制代码获取磁盘上文件的当前布局的映射。

  3. FSCTL_GET_RETRIEVAL_POINTERS 返回的 RETRIEVAL_POINTERS_BUFFER结构。

  4. 使用 FSCTL_MOVE_FILE 控制代码在浏览结构时移动每个群集。

    注意

    当其他进程写入磁盘时,可能需要更新位图或检索结构,或同时续订这两者。

     

碎片整理过程中使用的两个操作需要卷的句柄。 只有管理员可以获取卷的句柄,因此只有管理员可以对卷进行碎片整理。 应用程序应检查尝试运行碎片整理软件的用户的权限,如果用户没有适当的权限,则不应允许用户对卷进行碎片整理。

在对 FAT 或 FAT32 文件系统卷进行碎片整理期间使用 CreateFile 打开目录时,请指定 GENERIC_READ 访问掩码值。 不要指定 MAXIMUM_ALLOWED 访问掩码值。 如果这样做,将拒绝对目录的访问。

请勿尝试移动超出群集舍入文件大小的 NTFS 文件系统中分配的群集,因为结果是一个错误。

重新分析 NTFS 文件系统卷中的点、位图和属性列表可以进行碎片整理、打开以供读取和同步,并使用 filenametype 语法进行命名;例如, dirname:$i 30:$INDEX_ALLOCATION、 mrp::$DATA、 mrp::$REPARSE_POINT 和 mrp::$ATTRIBUTE_LIST。

对 NTFS 文件系统卷进行碎片整理时,允许对超出文件分配大小的虚拟群集进行碎片整理。

最大程度地减少碎片整理和卷影副本之间的交互

如果可能,以 16 KB (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 8和Windows Server 2012之前,不支持 Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP::$EA 和 ::$LOGGED_UTILITY_STREAM

任何目录支持的流类型。

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