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) |