CompactVirtualDisk 函数 (virtdisk.h)

减小虚拟硬盘的大小 (VHD) 备份存储文件。

语法

DWORD CompactVirtualDisk(
  [in]           HANDLE                           VirtualDiskHandle,
  [in]           COMPACT_VIRTUAL_DISK_FLAG        Flags,
  [in, optional] PCOMPACT_VIRTUAL_DISK_PARAMETERS Parameters,
  [in, optional] LPOVERLAPPED                     Overlapped
);

参数

[in] VirtualDiskHandle

打开虚拟磁盘的句柄,该句柄必须已使用传递给 OpenVirtualDiskVirtualDiskAccessMask 参数中的 VIRTUAL_DISK_ACCESS_METAOPS 标志打开。 有关如何打开虚拟磁盘的信息,请参阅 OpenVirtualDisk 函数。

[in] Flags

必须是 COMPACT_VIRTUAL_DISK_FLAG 枚举 (0) COMPACT_VIRTUAL_DISK_FLAG_NONE 值。

[in, optional] Parameters

指向包含压缩参数数据的有效 COMPACT_VIRTUAL_DISK_PARAMETERS 结构的可选指针。

[in, optional] Overlapped

如果需要异步操作,则为指向有效 OVERLAPPED 结构的可选指针。

返回值

请求的状态。

如果函数成功,则返回值 ERROR_SUCCESS

如果函数失败,则返回值为错误代码。 有关详细信息,请参阅 系统错误代码

注解

压缩只能在可动态扩展或差异的虚拟磁盘上运行。

有两种不同类型的压缩。

  • 第一种类型是文件系统感知压缩,它使用 NTFS 文件系统来确定可用空间。 为此,将 VHD 附加为只读设备,方法是在传递给 OpenVirtualDisk的 VirtualDiskAccessMask 参数中包含VIRTUAL_DISK_ACCESS_METAOPSVIRTUAL_DISK_ACCESS_ATTACH_RO标志,通过调用 AttachVirtualDisk 来附加 VHD,并在 VHD 附加时调用 CompactVirtualDisk。 在完成压缩之前分离 VHD 可能会导致压缩在完成之前返回失败 (类似于取消压缩) 。
  • 第二种类型(与文件系统无关的压缩)不涉及文件系统,但只查找完全用零填充的 VHD 块 (0) 。 为此,请将 VIRTUAL_DISK_ACCESS_METAOPS 标志包含在传递给 OpenVirtualDiskVirtualDiskAccessMask 参数中,并调用 CompactVirtualDisk
文件系统感知压缩是最有效的压缩类型,但首先使用文件系统感知压缩,然后使用与文件系统无关的压缩将产生最小的 VHD。

可以安全地中断虚拟磁盘上的压缩操作,并在以后重新运行。 重新打开已中断的虚拟磁盘文件可能会导致在打开时虚拟磁盘文件的大小减小。

压缩可以占用大量 CPU 和/或 I/O,具体取决于虚拟磁盘的大小以及需要移动的块数。

CompactVirtualDisk 函数在与调用方相同的安全上下文中在虚拟磁盘上运行。

要求

要求
最低受支持的客户端 Windows 7
最低受支持的服务器 Windows Server 2008 R2
目标平台 Windows
标头 virtdisk.h
Library VirtDisk.lib
DLL VirtDisk.dll

另请参阅

关于 VHD

VHD 参考