如何在旧版Windows 2000上获取硬盘的确切大小(以字节为单位)?
IOCTL_DISK_GET_LENGTH_INFO适用于卷,但不适用于Windows 2000上的物理磁盘句柄(///PHYSICALDISKx上的内容)。(适用于XP或更高版本的物理驱动器)
我们仍然需要支持这个古老的操作系统...
更新:
代码是用C语言编写的,所以如果可能的话我会使用普通的Windows API。
答案 0 :(得分:2)
你可以在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));
}
}
答案 1 :(得分:0)
每当我需要获取此类信息时,我通常会使用WMI,因为它提供了大量关于任何内容的数据。
答案 2 :(得分:0)
似乎没有IOCTL可以为您提供Windows 2000上的确切硬盘大小。
但有一种解决方法,有效:
我使用IOCTL_DISK_GET_DRIVE_GEOMETRY来获取柱面,轨道/圆柱,扇区/轨道,字节/扇区。
将它们相乘给了我一个粗略的硬盘尺寸但不是确切的尺寸(小一点)。我可以从中计算出几乎最后一个扇区id。
要获得我使用IOCTL_SCSI_PASS_THROUGH的确切大小并发送SCSI read commands以尝试读取磁盘末尾,所以我有一个不存在的扇区的扇区号,然后使用二进制搜索来获得读取成功的最高扇区ID。
将它与字节/扇区相乘,我得到硬盘的确切大小(以字节为单位)。