admin管理员组文章数量:1565774
判断磁盘类型(U盘,硬盘(移动硬盘还是电脑内置硬盘))
// CheckMoveDisk.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <Windows.h>
#include <vector>
#include <string>
#include "AsStringUtil.h"
#include <stdio.h>
using namespace std;
using namespace Asiafly::Base;
BOOL GetDisksProperty(TCHAR *drive);
bool checkRemoveDisk(vector<LPTSTR>* drivePath);
int main()
{
vector<LPTSTR>* drivePath;
checkRemoveDisk(drivePath);
system("pause");
return 0;
}
bool checkRemoveDisk(vector<LPTSTR>* drivePath) //参数存储所有移动盘的盘符
{
bool flag = false;
DWORD dw = GetLogicalDriveStrings(0, NULL);
LPTSTR lpDriveStrings = (LPTSTR)HeapAlloc(GetProcessHeap(), 0, dw * sizeof(TCHAR));
GetLogicalDriveStrings(dw, lpDriveStrings); //获取盘符,字符串形式。
do
{
UINT drivetype = GetDriveType(lpDriveStrings); //获取驱动器类型
if (drivetype == DRIVE_REMOVABLE)
//驱动器类型为DRIVE_REMOVABLE,进一步获取卷信息,如果获取成功,则将盘符保存。
{
TCHAR szFileSNBuffer[512];
DWORD dwFSystemFlags;
//获取卷信息,如果获取成功,则说明已插入U盘。
if (GetVolumeInformation(lpDriveStrings, NULL, 0, NULL, NULL, &dwFSystemFlags, szFileSNBuffer, 512))
{
//drivePath->push_back(lpDriveStrings);
flag = true;
std::cout << "U盘:" << AsStringUtil::ToString(lpDriveStrings) << std::endl;
}
}
else
if (drivetype == DRIVE_FIXED) //驱动器类型为DRIVE_FIXED,需要进一步判断是移动硬盘还是本地硬盘。
{
if (GetDisksProperty(lpDriveStrings) == TRUE) //GetDisksProperty区分移动硬盘和本地硬盘,返回TRUE为移动硬盘.
{
//drivePath->push_back(lpDriveStrings);
//flag = true;
std::cout << "移动磁盘:" << AsStringUtil::ToString(lpDriveStrings)<<std::endl;
}
else
{
std::cout << "本地磁盘:" << AsStringUtil::ToString(lpDriveStrings) << std::endl;;
}
}
lpDriveStrings += (lstrlen(lpDriveStrings) + 1);
} while (*lpDriveStrings != '\x00');
return flag;
}
BOOL GetDisksProperty(TCHAR *drive)
{
STORAGE_PROPERTY_QUERY Query;
DWORD dwOutBytes;
BOOL bResult;
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
std::string cstr(AsStringUtil::ToString(drive));
cstr = "\\\\.\\" + cstr;
cstr = cstr.substr(0, cstr.length()-1);
HANDLE hDevice = CreateFile(
AsStringUtil::ToWstring(cstr).c_str(), // 要打开的驱动器设备;格式必须为“\\.\C:”,否则打开失败,返回错误码2:系统找不到指定的文件。
GENERIC_READ | GENERIC_WRITE, // 访问权限
FILE_SHARE_READ | FILE_SHARE_WRITE, //共享模式
NULL, // 使用默认的安全属性
OPEN_EXISTING, // 打开存在的设备
NULL,
NULL
);
if (hDevice == INVALID_HANDLE_VALUE)
{
return FALSE;
}
STORAGE_DESCRIPTOR_HEADER *pDevDescHeader;
pDevDescHeader = (STORAGE_DESCRIPTOR_HEADER *)malloc(sizeof(STORAGE_DESCRIPTOR_HEADER));
if (NULL == pDevDescHeader)
{
return FALSE;
}
bResult = DeviceIoControl(
hDevice, // 设备句柄
IOCTL_STORAGE_QUERY_PROPERTY, // 操作控制码
&Query, sizeof Query, //输入参数及缓冲区大小
pDevDescHeader, //输出参数
sizeof(STORAGE_DESCRIPTOR_HEADER), //输出参数的缓冲区大小
&dwOutBytes, //实际输出的大小
NULL);
if (!bResult)
{
free(pDevDescHeader);
(void)CloseHandle(hDevice);
return FALSE;
}
PSTORAGE_DEVICE_DESCRIPTOR pDevDesc;
pDevDesc = (STORAGE_DEVICE_DESCRIPTOR *)malloc(pDevDescHeader->Size);
bResult = DeviceIoControl(hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query, sizeof Query,
pDevDesc, pDevDescHeader->Size,
&dwOutBytes,
NULL);
free(pDevDescHeader);
(void)CloseHandle(hDevice);
if (pDevDesc->BusType == BusTypeUsb)//总线类型为USB,返回TRUE
{
free(pDevDesc);
return TRUE;
}
free(pDevDesc);
return FALSE;
}
U盘插入判断:
U盘判断可以通过GetDriveType,如果是DRIVE_REMOVABLE类型则为U盘,但是在不能判断u盘是否插入。用GetVolumeInformation获取卷信息,如果获取到U盘信息说明U盘已经插入。
移动硬盘是否为内置的:
一般内置硬盘直连主板,读取速度比较快。外接硬盘以USB连接,读取速度比内置硬盘要慢的多。过总线类型判断是否USB接入,如果总线类型为USB则是移动硬盘
版权声明:本文标题:判断磁盘类型(U盘,硬盘(移动硬盘还是电脑内置硬盘)) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1726821511a1085887.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论