不幸的是,此链接已关闭,但它确实有我的实际问题: Get size of volume on Windows
当我使用WMI在Windows中获取卷的容量时,通过Win32_Volume和我的c:\驱动器的Capacity属性,我得到这个值: 499513290752
然而,当我使用
时bool Success = DeviceIoControl(
Handle,
IoControl.IOCTL_DISK_GET_LENGTH_INFO,
IntPtr.Zero, //InBuffer
0, //InBuffer Size
OutputBuffer,
(uint)Marshal.SizeOf(OutputLengthInfo),
out BytesReturned,
IntPtr.Zero
);
我得到:499513294848,这比WMI报告的要大4096。我发现硬盘上的每个卷都是一样的。 (此Handle是一个SafeFileHandle,它是通过调用CreateFile()获得的,文件名为“\\?\ Volume {93b1858d-033d-4719-a42a-870d8eb3fe0d} \”)。
另外,使用以下命令查询c:\ drive
uint SectorsPerCluster = 0;
uint BytesPerSector = 0;
uint NumberOfFreeClusters = 0;
uint TotalNumberOfClusters = 0;
GetDiskFreeSpace(
Drive,
out SectorsPerCluster,
out BytesPerSector,
out NumberOfFreeClusters,
out TotalNumberOfClusters
);
报告总共有121951487个群集,每个群集8个扇区,每个扇区512个字节,这给出499513290752个字节,与WMI相同。
当我使用Win32_DiskPartition时,它会报告与DeviceIoControl相同的容量值,这很奇怪(这里的文件名是“\\?\ GLOBALROOT \ Device \ Harddisk0 \ Partition1”作为一个例子)。
在比较从Win32_DiskDrive和DeviceIoControl函数获得的值时,我也得到一个完全不同的数字,用于“\\。\ PhysicalDrive0”给出的物理磁盘:
Win32_DiskDrive:500105249280
IoControl:500107862016(我认为相差约2.5 MiB)
Win32_DiskDrive大小与WMI类中报告的每扇区字节数* TotalSectors的数学匹配:每扇区512字节* 976768065总扇区= 500105249280.如果IoControl值正确,则表示实际上有976773168个扇区。 Disk Geometry的值也支持500105249280磁盘大小。
那么,我应该信任哪个值/来源,为什么它们总是4096字节不同的卷? IOCTL_DISK_GET_LENGTH_INFO仅对分区有效,而对物理磁盘或卷无效吗?
更新: 更多信息/澄清。我还尝试读取物理扇区,并且可以读取DiskGeometry和Win32_DiskDrive报告的磁盘大小。在这种情况下,IOCTL_DISK_GET_LENGTH_INFO值实际上是正确的,我可以读取此函数报告的扇区数,并且只有在我尝试读取它时才会出错。那么为什么其他功能不会报告实际的扇区总数/正确的大小?物理磁盘是否隐藏了某些功能无法访问的某些区域?
答案 0 :(得分:0)
GetDiskFreeSpace 报告文件系统卷大小,在 NTFS 的情况下,它不包括在卷(分区)末尾包含备份扇区的集群。
IOCTL_DISK_GET_LENGTH_INFO 报告实际卷(分区)大小(它不是指文件系统卷)。