在不使用GetDiskFreeSpace的情况下确定卷集大小

时间:2012-07-07 08:47:28

标签: windows winapi filesystems

我想以编程方式确定安装在Windows系统上的卷(a.k.a.文件系统)的群集(a.k.a.分配单元)大小。出于各种原因,我想找到一个使用GetDiskFreeSpace()的解决方案。

是否有可用于此目的的FSCTL_xxx或IOCTL_xxx请求?

2 个答案:

答案 0 :(得分:4)

您需要在驻留在卷上的文件句柄上调用NtQueryVolumeInformationFile,请求FileFsSizeInformation。你应该能够通过

获得这个功能
GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")),"NtQueryVolumeInformationFile")

生成的FILE_FS_SIZE_INFORMATION结构将具有SectorsPerAllocationUnit值和BytesPerSector值,当相乘时,它会为您提供分配单元(群集)的大小。

答案 1 :(得分:2)

您可以将DeviceIoControl与IOCTL_STORAGE_QUERY_PROPERTY一起使用。输入时,将PropertyId结构中的STORAGE_PROPERTY_QUERY设置为StorageAccessAlignmentProperty

这将为您提供STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR,其中包含BytesPerLogicalSectorBytesPerPhysicalSector的成员。链接的参考页面包括用于检索和显示设备的逻辑/物理扇区大小的演示代码。