之前在写QT软件的时候,软件需求中有“列出所有可操作磁盘”的要求,查阅了不少资料,包括微软官方文档。官网中的确有这个函数的介绍,但也仅仅是介绍,我觉得很让人无语的就是这一点,只有介绍,没有实例,对于基础薄弱的人(我)来说,根本就看不懂怎么使用,现将我的经验分享给大家!
GetLogicalDrives()的原函数为DWORD GetLogicalDrives(),返回值为当前可用磁盘驱动器的位掩码。
如果函数使用成功,则返回值为二进制数(如1100)的十进制值(如12),从右往左数,依次是A盘、B盘、C盘、D盘,对应位置上的二进制值为1时表示此盘存在,即返回值12表示电脑中存在C、D盘,以此类推;
如果函数使用失败,则返回值为0,函数失败的原因可以通过GetLastError()函数获取,将得到的返回值记录,然后去网站中查询GetLastError()函数返回值大全找到对应的数值结果即可。
…Copy大法给大家了,快用起来!!!!…
#include#include 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,我会更有动力更新文章嚯!)



