0

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

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

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

更新:

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

4

3 回答 3

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));
             }
       }
于 2013-09-23T13:08:12.797 回答
0

似乎没有 IOCTL 可以为您提供 Windows 2000 上的确切硬盘大小。

但是有一个解决方法,有效:

我使用IOCTL_DISK_GET_DRIVE_GEOMETRY来获取柱面、磁道/磁道、扇区/磁道、字节/扇区。

将它们相乘给了我硬盘的粗略尺寸,但不是确切的尺寸(小一点)。我可以从中计算出几乎最后一个扇区ID。

为了获得确切的大小,我使用了IOCTL_SCSI_PASS_THROUGH并发送了SCSI 读取命令来尝试读取磁盘末尾之外的内容,因此我有一个不存在扇区的扇区号,然后使用二进制搜索来获取读取成功的最高扇区 ID。

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

于 2013-09-27T15:19:30.817 回答
0

每当我需要获取此类信息时,我通常会使用WMI,因为它提供了关于几乎所有内容的大量数据。

于 2013-09-23T12:39:50.783 回答