如何在Windows 2000上获取硬盘大小(以字节为单位)?

时间:2013-09-23 12:03:38

标签: c windows hard-drive ioctl windows-2000

如何在旧版Windows 2000上获取硬盘的确切大小(以字节为单位)?

IOCTL_DISK_GET_LENGTH_INFO适用于卷,但不适用于Windows 2000上的物理磁盘句柄(///PHYSICALDISKx上的内容)。(适用于XP或更高版本的物理驱动器)

我们仍然需要支持这个古老的操作系统...

更新:

代码是用C语言编写的,所以如果可能的话我会使用普通的Windows API。

3 个答案:

答案 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。

将它与字节/扇区相乘,我得到硬盘的确切大小(以字节为单位)。