之前在写QT软件的时候,软件需求中有“列出所有可操作磁盘”的要求,查阅了不少资料,包括微软官方文档。官网中的确有这个函数的介绍,但也仅仅是介绍,我觉得很让人无语的就是这一点,只有介绍,没有实例,对于基础薄弱的人(我)来说,根本就看不懂怎么使用,现将我的经验分享给大家!
GetLogicalDrives()的原函数为DWORD GetLogicalDrives(),返回值为当前可用磁盘驱动器的位掩码。
如果函数使用成功,则返回值为二进制数(如1100)的十进制值(如12),从右往左数,依次是A盘、B盘、C盘、D盘,对应位置上的二进制值为1时表示此盘存在,即返回值12表示电脑中存在C、D盘,以此类推;
如果函数使用失败,则返回值为0,函数失败的原因可以通过GetLastError()函数获取,将得到的返回值记录,然后去网站中查询GetLastError()函数返回值大全找到对应的数值结果即可。
…Copy大法给大家了,快用起来!!!!…
#include <iostream>
#include <windows.h>
using namespace std;
//扫描磁盘
void ScanHD(string &uDiskAvaliable) //uDiskAvaliable即可使用的U盘名称字符串
{
uDiskAvaliable = "";
char diskPath[3] = { 0 }; //检测存在的U盘设备
DISK_GEOMETRY pdg;
HANDLE DiskHandle;
UINT64 DiskSize;
DWORD allDisk = GetLogicalDrives(); //获取电脑中的所有磁盘(即二进制对应的十进制数值),假设电脑中可能有15个磁盘
for(int i = 0; i < 15; i++){
if((allDisk & 1) == 1){ //判断最右边的一位的二进制数值是否为1
sprintf(diskPath, "%c", 'A'+i);
//此时的diskPath的值为类似 "C:",如果只需要所有磁盘,则增加 uDiskAvaliable += diskPath 即可结束当前的if语句
//判断是否为U盘,且获取U盘的字节大小
strcat(diskPath,":");
if (GetDriveTypeA(diskPath) == DRIVE_REMOVABLE){ //判断磁盘的类型
char tmp[10] = "\\\\.\\";
uDiskAvaliable += diskPath;
uDiskAvaliable += "(";
strcat(tmp,diskPath); //形成\\.\F:
DiskHandle = CreateFileA(tmp, //获取磁盘句柄
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
DeviceIoControl(DiskHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &pdg, sizeof(pdg), NULL, (LPOVERLAPPED)NULL);
CloseHandle(DiskHandle); //关闭磁盘句柄
DiskSize = (UINT64)pdg.Cylinders.QuadPart * pdg.TracksPerCylinder * pdg.SectorsPerTrack * pdg.BytesPerSector;
sprintf(tmp, "%.2lf", 1.0*DiskSize/1024/1024/1024);
uDiskAvaliable += tmp;
uDiskAvaliable += "GB),"; //以GB作单位,保留两位小数
}
}
allDisk = allDisk >> 1; //这一句非常重要!!!挪动判断的位置!!!!!!!
}
uDiskAvaliable += "please fill such as F:";
}
当时真的难住我了,主要是因为文档看不懂,网上搜到的结果乱七八糟的,现在分享给大家了!!!!!
最后,有帮助的话可以给我一丢丢赞赏嚯!(记得备注CSDN,我会更有动力更新文章嚯!)