如何在舊的Windows 2000上以字節爲單位獲得硬盤的確切大小?如何在Windows 2000上以字節爲單位獲取硬盤大小?
IOCTL_DISK_GET_LENGTH_INFO工作正常體積,但不能在Windows 2000上的物理磁盤句柄(在//./PHYSICALDISKx東西)
(從XP或物理驅動器後正常工作),我們還是要支持此古OS ...
UPDATE:
的代碼是用C寫的,所以如果可能的話,我會用普通的Windows API。
如何在舊的Windows 2000上以字節爲單位獲得硬盤的確切大小?如何在Windows 2000上以字節爲單位獲取硬盤大小?
IOCTL_DISK_GET_LENGTH_INFO工作正常體積,但不能在Windows 2000上的物理磁盤句柄(在//./PHYSICALDISKx東西)
(從XP或物理驅動器後正常工作),我們還是要支持此古OS ...
UPDATE:
的代碼是用C寫的,所以如果可能的話,我會用普通的Windows API。
似乎沒有IOCTL,讓您在Windows 2000上
確切的硬盤驅動器大小但有一個解決方法,工作:
我用IOCTL_DISK_GET_DRIVE_GEOMETRY來獲取汽缸,軌道/ cyl,扇區/軌道,字節/部門。
乘以它們給了我一個粗略的硬盤大小,但不是確切的大小(小一點)。我可以從中計算出最近的部門ID。
爲了得到確切的大小我用IOCTL_SCSI_PASS_THROUGH和發送SCSI read commands試圖讀取超出磁盤的末尾,所以我有一個扇區號爲一個不存在的部門,然後使用二進制搜索得到最高的部門id在哪裏讀成功。
將它與字節/扇區相乘,我得到硬盤的確切大小,以字節爲單位。
如果你運行「dir c:\
」你可以得到在C自由空間(沒有任何API或等)
,最後一行會給你的可用磁盤空間。
更好的解決方案: 「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不工作的方式是什麼?我認爲它失敗了一個特定的錯誤代碼?您是否嘗試過任何其他ioctls(GET_DRIVE_LAYOUT,GET_LENGTH_INFO等)? – Luke
@Luke在Windows 2000上,當我在通過在////PHYSICALDRIVEx打開驅動器獲得的句柄上使用它時,它會給出ERROR_INVALID_FUNCTION。它稍後在XP上運行良好。所以我正在尋找該操作系統的解決方法。獲取磁盤上確切的字節數是一項要求。 – Calmarius
你可以通過IOCTL_DISK_GET_DRIVE_GEOMETRY得到它。它爲您提供了柱面,每個柱面的軌跡,每個軌道的扇區以及每扇區的字節數。將它們全部疊加在一起,它將爲您提供磁盤的總字節數。 – Luke