查找指定类型的驱动器

最近正在写一个程序,其中有一个需求是程序运行时,必须要将特定的光盘放在光驱之中,因此需要枚举当前系统中所有的光驱并逐一识别是否是符合要求的光盘。

通过系统函数GetLogicalDriveStrings与GetDriveType要以完成上述需求,简述如下。

1.函数GetLogicalDriveStrings

其原型如下:

DWORD GetLogicalDriveStrings(
DWORD nBufferLength,
LPTSTR lpBuffer)

其第二个参数是一个缓冲区,用于存储驱动器信息;第一个参数nBufferLength指明第二个参数指向缓冲区的长度。函数GetLogicalDriveStrings执行后,可以以字符串形式将当前系统中所有驱动器的根目录存储于参数lpBuffer指向的缓冲区中。不过要注意的是,每个驱动器的根目录之间使用字符串的终止标识符'\0'进行分隔,例如当前系统中含有C、D、E三个驱动器,则其中存储的字符如以下:

C:\\0D:\\0E:\\0

所以在取得驱动器名称时,需要对它们进行分割处理。

2.函数GetDriveType

其原型如下:

UINT GetDriveType(LPCTSTR lpRootPathName)

它只有一个参数,其含义为驱动器的根目录。而其返回值可以是以下列表中的一个:

DRIVE_UNKNOWN 0 未知类型的驱动器
DRIVE_NO_ROOT_DIR 1 无效的根目录,
DRIVE_REMOVABLE2 可移动的驱动器,例如软盘、U盘
DRIVE_FIXED 3固定的驱动器,例如硬盘
DRIVE_REMOTE 4 远程驱动器
DRIVE_CDROM 5 CD-ROM驱动器
DRIVE_RAMDISK 6 RAM驱动器

为了查找出系统中的光盘,可以先利用函数GetLogicalDriveStrings查找出系统中的所有驱动器,然后利用GetLogicalDriveStrings查询出的各驱动器根目录作为函数GetDriveType的参数取得该驱动器的类型。

在当前这个项目中,查找光盘的功能做在了单独的头文件与源文件之中。

头文件EnumDrive.h的代码如下:

#ifndef __ENUMDRIVE_H_
#define __ENUMDRIVE_H_

#include <windows.h>

/* 驱动器类型 */
#define HARDDISKDRIVE_FIXED//硬盘
#define CDROMDRIVE_CDROM//光驱
#define REMOVABLEDRIVE_REMOVABLE//可移动

/* 磁盘信息结点 */
typedef struct DriveInfo
{
char szDriveName[32];
struct DriveInfo* next;
}DRIVEINFO,*PDRIVEINFO;

/**********************************************************************
* 函数名: GetDiskList
* 参 数: int指定要获取的磁盘类型
* 返回值: PDRIVEINFO磁盘信息列表
*********************************************************************/
PDRIVEINFO GetDiskList(int nDriveKind);

/**********************************************************************
* 函数名: GetDiskList
* 参 数: int指定要获取的磁盘类型
* 返回值: PDRIVEINFO磁盘信息列表
*********************************************************************/
void FreeDriveinfoList(PDRIVEINFO ph);


#endif

源文件EnumDrive.cpp的代码如下:

#include "EnumDrive.h"

/**********************************************************************
* 函数名: GetDiskList
* 参 数: int指定要获取的磁盘类型
* 返回值: PDRIVEINFO磁盘信息列表
*********************************************************************/
PDRIVEINFO GetDiskList(int nDriveKind)
{
DWORD dwDriveStrLen = 0;
dwDriveStrLen= GetLogicalDriveStrings(0,NULL); //取得存储驱动器列表需要的字符数
TCHAR *szDriveName = new char[dwDriveStrLen];
TCHAR *pDriveName=NULL;

PDRIVEINFO pHead = NULL;
PDRIVEINFO pCur = NULL;

if(GetLogicalDriveStrings(dwDriveStrLen,szDriveName))
{
pDriveName = szDriveName;
while(*pDriveName!=NULL)
{
if(nDriveKind == GetDriveType(pDriveName))
{
PDRIVEINFO pTmp = new DRIVEINFO;
memset(pTmp, 0, sizeof(DRIVEINFO));
if(pTmp != NULL)
{
strcpy(pTmp->szDriveName, pDriveName);
if(pCur == NULL || pHead == NULL)
{
pHead = pCur = pTmp;
}
else
{
pCur->next = pTmp;
pCur = pTmp;
}
}
} // end of if(nDriveKind = GetDriveType(pDriveName))
pDriveName+=lstrlen(pDriveName)+1;
} // end of while(*pDriveName!=NULL)
}

return pHead;
}

/**********************************************************************
* 函数名: GetDiskList
* 参 数: int指定要获取的磁盘类型
* 返回值: PDRIVEINFO磁盘信息列表
*********************************************************************/
void FreeDriveinfoList(PDRIVEINFO ph)
{
PDRIVEINFO p = ph;
PDRIVEINFO t;
while(p)
{
t = p->next;
delete p;
p = t;
}
}

以下是测试代码:

#include "EnumDrive.h"
#include <stdio.h>

void main()
{
PDRIVEINFO p, t;
//光驱
printf("光驱:\n");
p = GetDiskList(CDROM);
t = p;
while(p)
{
printf("%s\n", p->szDriveName);
p = p->next;
}
FreeDriveinfoList(t);
p = t = NULL;

//硬盘
printf("硬盘:\n");
p = GetDiskList(HARDDISK);
t = p;
while(p)
{
printf("%s\n", p->szDriveName);
p = p->next;
}
FreeDriveinfoList(t);
p = t = NULL;

//可移动盘
printf("可移动盘:\n");
p = GetDiskList(REMOVABLE);
t = p;
while(p)
{
printf("%s\n", p->szDriveName);
p = p->next;
}
FreeDriveinfoList(t);
p = t = NULL;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值