FSCTL_QUERY_ALLOCATED_RANGES IOCTL (winioctl.h)

扫描文件或备用流,查找可能包含非零数据的范围。 只有压缩文件或稀疏文件才能具有操作系统已知的清零范围。 对于其他文件,输出缓冲区将仅包含单个条目,其中包含起始点和请求的长度。

若要执行此操作,请使用以下参数调用 DeviceIoControl 函数。

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_QUERY_ALLOCATED_RANGES,     // dwIoControlCode
  (LPVOID) lpInBuffer,              // input buffer
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // output buffer
  (DWORD) nOutBufferSize,           // size of output buffer
  (LPDWORD) lpBytesReturned,        // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

注解

有关重叠 I/O 对此操作的影响,请参阅 DeviceIoControl 的“备注”部分。

NTFS 文件系统将输入文件偏移量向下舍入到方便的边界,将长度向上舍入到方便的边界,然后开始遍历文件。

操作系统不会跟踪零 (0) 或非零数据的每一部分。 由于零 (0) 通常是一个完全合法的基准,因此会具有误导性。 相反,系统会跟踪分配磁盘空间的范围。 如果未分配磁盘空间,则假定所有数据为零, (0) 。 分配的存储可以包含零 (0) 或非零数据。 因此,此操作将返回有关文件部分(其中非零数据可能位于)的信息。 由应用程序根据应用程序的数据约定扫描文件的这些部分。

输出数组中的每个条目都包含一个偏移量和一个长度,指示文件中可能包含非零数据的范围。 实际的非零数据(如果有)位于此范围内的某个位置,调用程序必须在该范围内进一步扫描才能找到它,并确定它是否确实是有效数据。 有效数据的多个实例可能存在于范围内。

分配的范围受以下规则的约束:内存映射远程 (网络) 文件,而文件的打开句柄不一定一致。 如果内存映射了稀疏网络文件,并将非零数据写入文件以前未分配的区域,则会为新数据分配磁盘空间。 但是,此后对 FSCTL_QUERY_ALLOCATED_RANGES 的调用不一定返回分配区域的正确列表。 若要确保视图内存与文件句柄之间的一致性,请使用 FlushViewOfFile 函数将数据刷新到文件。

在Windows 8和Windows Server 2012中,以下技术支持此代码。

技术 支持
服务器消息块 (SMB) 3.0 协议
SMB 3.0 透明故障转移 (TFO)
具有横向扩展文件共享的 SMB 3.0 (SO)
群集共享卷文件系统 (CSV)
弹性文件系统 (ReFS)

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
标头 winioctl.h (包括 Windows.h)

另请参阅