如何在旧的 Windows 2000 上获得硬盘的确切大小(以字节为单位)?
IOCTL_DISK_GET_LENGTH_INFO 适用于卷,但不适用于 Windows 2000 上的物理磁盘句柄(位于 //./PHYSICALDISKx 的内容)。(适用于 XP 或更高版本的物理驱动器)
我们仍然必须支持这个古老的操作系统......
更新:
代码是用 C 编写的,所以如果可能的话,我会使用普通的 Windows API。
如何在旧的 Windows 2000 上获得硬盘的确切大小(以字节为单位)?
IOCTL_DISK_GET_LENGTH_INFO 适用于卷,但不适用于 Windows 2000 上的物理磁盘句柄(位于 //./PHYSICALDISKx 的内容)。(适用于 XP 或更高版本的物理驱动器)
我们仍然必须支持这个古老的操作系统......
更新:
代码是用 C 编写的,所以如果可能的话,我会使用普通的 Windows API。
您可以在 C 中获得可用空间(无需任何 API 等)
如果您运行“ dir c:\
”,最后一行将为您提供可用磁盘空间。
更好的解决方案:“ fsutil volume diskfree c:
”
或者试试下面的代码...
void main (int argc, wchar_t **argv)
{
BOOL fResult;
unsigned __int64 i64FreeBytesToCaller,
i64TotalBytes,
i64FreeBytes;
fResult = GetDiskFreeSpaceEx (L"C:",
(PULARGE_INTEGER)&i64FreeBytesToCaller,
(PULARGE_INTEGER)&i64TotalBytes,
(PULARGE_INTEGER)&i64FreeBytes);
if (fResult)
{
printf ("\n\nGetDiskFreeSpaceEx reports\n\n");
printf ("Available space to caller = %I64u MB\n",
i64FreeBytesToCaller / (1024*1024));
printf ("Total space = %I64u MB\n",
i64TotalBytes / (1024*1024));
printf ("Free space on drive = %I64u MB\n",
i64FreeBytes / (1024*1024));
}
}
似乎没有 IOCTL 可以为您提供 Windows 2000 上的确切硬盘大小。
但是有一个解决方法,有效:
我使用IOCTL_DISK_GET_DRIVE_GEOMETRY来获取柱面、磁道/磁道、扇区/磁道、字节/扇区。
将它们相乘给了我硬盘的粗略尺寸,但不是确切的尺寸(小一点)。我可以从中计算出几乎最后一个扇区ID。
为了获得确切的大小,我使用了IOCTL_SCSI_PASS_THROUGH并发送了SCSI 读取命令来尝试读取磁盘末尾之外的内容,因此我有一个不存在扇区的扇区号,然后使用二进制搜索来获取读取成功的最高扇区 ID。
将它与字节/扇区相乘,我得到了硬盘的确切大小(以字节为单位)。
每当我需要获取此类信息时,我通常会使用WMI,因为它提供了关于几乎所有内容的大量数据。