获取c++窗口中硬盘的总大小
Get total size of a hard disk in c++ windows
我正在尝试获取物理驱动器的总大小(未分配+主分区+扩展分区大小)。
磁盘名称为\.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);
}
相关文章:
- 通过搜索硬盘驱动器查找文件目录
- 如何确定文件或文件夹是在SSD还是硬盘驱动器上?
- 将硬盘驱动器上的 BIT XXX 从 0 更改为 1
- 如何在文件系统之上添加层?就像OneDrive或Google云端硬盘中的缓存一样
- 如何在Android NDK中的硬盘驱动器中读取图像
- 我正在尝试检索硬盘驱动器的序列号或电池标签
- 如何将迭代器(或类似的东西)存储到硬盘上
- Windows硬盘实时复制
- 在硬盘上操纵特定位
- 指针如何引用硬盘中的段
- 存储在硬盘中一个CVSVM对象
- 获得有关硬盘扇区中原始数据更改的通知-文件更改通知
- 在OpenCV中加速将图像写入硬盘
- 读取硬盘字节数
- 在Linux上用C++格式化硬盘
- 我可以以1 Gbps的速度写入硬盘吗
- 如何在C++中使用WMI获取硬盘的所有逻辑驱动器的可用空间
- C++Win32 有关所有驱动器的信息:硬盘驱动器、USB 驱动器、光盘驱动器、软盘驱动器等
- 如何区别外部硬盘和内部硬盘
- 在C中,在硬盘驱动器上没有文件的情况下写入文件steam