获取c++窗口中硬盘的总大小

Get total size of a hard disk in c++ windows

本文关键字:硬盘 c++ 窗口 获取      更新时间:2023-10-16

我正在尝试获取物理驱动器的总大小(未分配+主分区+扩展分区大小)。

磁盘名称为\.PhysicalDriveX

我尝试使用GetDiskFreeSpaceEx,但是当分区是扩展分区时,它没有给出正确的结果,在这种情况下,它返回分区的总大小。

BOOL ret = FALSE;
ULARGE_INTEGER ulFreeSpace;
ULARGE_INTEGER ulTotalSpace;
ULARGE_INTEGER ulTotalFreeSpace;
__int64 ulTotalUsedSpace = 0;
GetDiskFreeSpaceEx(szBuffer, &ulFreeSpace, &ulTotalSpace, &ulTotalFreeSpace);
*diskSize = ulTotalSpace.QuadPart;

我可以使用IOCTL_DISK_GET_DRIVE_LAYOUT_EX使用DeviceIoControl获得分区信息但是我对扩展分区大小感到困惑。

有一种方法,我可以准确地得到一个硬盘在windows上的c++的总大小?

由于您讨论的是物理磁盘而不是分区,因此请查看DeviceIoControl。

示例,其中包括wmain中磁盘总大小的计算:

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
BOOL GetDriveGeometry(LPWSTR wszPath, DISK_GEOMETRY *pdg)
{
  HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined 
  BOOL bResult   = FALSE;                 // results flag
  DWORD junk     = 0;                     // discard results
  hDevice = CreateFileW(wszPath,          // drive to open
                        0,                // no access to the drive
                        FILE_SHARE_READ | // share mode
                        FILE_SHARE_WRITE, 
                        NULL,             // default security attributes
                        OPEN_EXISTING,    // disposition
                        0,                // file attributes
                        NULL);            // do not copy file attributes
  if (hDevice == INVALID_HANDLE_VALUE)    // cannot open the drive
  {
    return (FALSE);
  }
  bResult = DeviceIoControl(hDevice,                       // device to be queried
                            IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
                            NULL, 0,                       // no input buffer
                            pdg, sizeof(*pdg),            // output buffer
                            &junk,                         // # bytes returned
                            (LPOVERLAPPED) NULL);          // synchronous I/O
  CloseHandle(hDevice);
  return (bResult);
}
int wmain(int argc, wchar_t *argv[])
{
  DISK_GEOMETRY pdg = { 0 }; // disk drive geometry structure
  BOOL bResult = FALSE;      // generic results flag
  ULONGLONG DiskSize = 0;    // size of the drive, in bytes
  bResult = GetDriveGeometry (wszDrive, &pdg);
  if (bResult) 
  {
    wprintf(L"Drive path      = %wsn",   wszDrive);
    wprintf(L"Cylinders       = %I64dn", pdg.Cylinders);
    wprintf(L"Tracks/cylinder = %ldn",   (ULONG) pdg.TracksPerCylinder);
    wprintf(L"Sectors/track   = %ldn",   (ULONG) pdg.SectorsPerTrack);
    wprintf(L"Bytes/sector    = %ldn",   (ULONG) pdg.BytesPerSector);
    DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
               (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
    wprintf(L"Disk size       = %I64d (Bytes)n"
            L"                = %.2f (Gb)n", 
            DiskSize, (double) DiskSize / (1024 * 1024 * 1024));
  } 
  else 
  {
    wprintf (L"GetDriveGeometry failed. Error %ld.n", GetLastError ());
  }
  return ((int)bResult);
}