c++ - 在 C++ Windows 中获取硬盘的总大小

标签 c++ winapi visual-c++ filesystems

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

我的磁盘名称为 \\.\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;

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

有没有一种方法可以在 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      = %ws\n",   wszDrive);
    wprintf(L"Cylinders       = %I64d\n", pdg.Cylinders);
    wprintf(L"Tracks/cylinder = %ld\n",   (ULONG) pdg.TracksPerCylinder);
    wprintf(L"Sectors/track   = %ld\n",   (ULONG) pdg.SectorsPerTrack);
    wprintf(L"Bytes/sector    = %ld\n",   (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);
}

关于c++ - 在 C++ Windows 中获取硬盘的总大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15384916/

相关文章:

c# - 获取独占进程句柄

c++ - 如何在获取事件后延迟 1s 复制文件?

c++ - delete[] 在 C++ 中真的有效吗?

c++ - 获取当前图像基地址

windows - 戈朗 : winapi call with struct parameter

c++ - 我可以使用 Visual C++ 开发跨平台桌面应用程序吗?

c++ - Qt5 中如何判断 QHostAddress 是 IPv4 还是 IPv6?

c++ - 使用 fork/execvp 和系统调用的区别

c++ - 运行时检查失败 #2 - 变量 'numberchoices' 周围的堆栈已损坏

c++ - 从使用 Wix 制作的 MSI 生成文本