最近正在写一个程序,其中有一个需求是程序运行时,必须要将特定的光盘放在光驱之中,因此需要枚举当前系统中所有的光驱并逐一识别是否是符合要求的光盘。
通过系统函数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_REMOVABLE 2 可移动的驱动器,例如软盘、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 HARDDISK DRIVE_FIXED //硬盘
#define CDROM DRIVE_CDROM //光驱
#define REMOVABLE DRIVE_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;
}