查询某个硬盘的物理容量时报错:
使用驱动器X:中的光盘之前需要将其格式化
//获取磁盘大小,单位是MB
long CMDiskManager::GetDiskSizeMB(DWORD vDiskNo)
{
TRACE(" CMDiskManager::GetDiskSize 1 vDiskNo=%d \n", vDiskNo);
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
wchar_t diskPath[256]; //磁盘内部路径
//生成磁盘内部路径
swprintf_s(diskPath, _T("\\\\.\\PhysicalDrive%d"), vDiskNo);
try{
hDevice = CreateFile(diskPath, // drive 或者 用"\\\\.\\PhysicalDrive0" 代表第一块磁盘
GENERIC_READ, // 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
}
catch (exception e){
//TRACE("GetDiskSize CreateFile error" );
return -1;
}
if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
TRACE(" CMDiskManager::GetDiskSize no disk %d \n", vDiskNo);
return 0;
}
TRACE(" CMDiskManager::GetDiskSize 3 \n");
GET_LENGTH_INFORMATION pdg;
//运行下面这段时会报错:使用驱动器X:中的光盘之前需要将其格式化,不知道什么原因,2017.2.24,wzy
bResult = DeviceIoControl(hDevice, // device to be queried
IOCTL_DISK_GET_LENGTH_INFO, // operation to perform
NULL, 0, // no input buffer
&pdg, sizeof(pdg), // output buffer
&junk, // # bytes returned
(LPOVERLAPPED)NULL); // synchronous I/O
CloseHandle(hDevice);
/* INT64 nUseSize = disk_len.Length.QuadPart;
INT64 sizeGB = nUseSize / 1014 / 1024 / 1024;
CString szSize;
szSize.Format(L"C盘大小 %I64d GB", sizeGB);
*/
long MB = (long)(pdg.Length.QuadPart >> 20);
if (MB < 0){
MB = 0;
}
TRACE(" CMDiskManager::GetDiskSize %dMB \n", MB);
//CString s;
//s.Format("C盘大小 %f GB", MB/1024.0);
//AfxMessageBox(s, 0, MB_OK);
//float x = (float) MB ;
return MB;
}