之前在写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 = "";
char diskPath[3] = { 0 };
DISK_GEOMETRY pdg;
HANDLE DiskHandle;
UINT64 DiskSize;
DWORD allDisk = GetLogicalDrives();
for(int i = 0; i < 15; i++){
if((allDisk & 1) == 1){
sprintf(diskPath, "%c", 'A'+i);
strcat(diskPath,":");
if (GetDriveTypeA(diskPath) == DRIVE_REMOVABLE){
char tmp[10] = "\\\\.\\";
uDiskAvaliable += diskPath;
uDiskAvaliable += "(";
strcat(tmp,diskPath);
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),";
}
}
allDisk = allDisk >> 1;
}
uDiskAvaliable += "please fill such as F:";
}
当时真的难住我了,主要是因为文档看不懂,网上搜到的结果乱七八糟的,现在分享给大家了!!!!!
最后,有帮助的话可以给我一丢丢赞赏嚯!(记得备注CSDN,我会更有动力更新文章嚯!)
|