如何用编程获取CD-ROM的驱动器盘符

[提出问题]

最近我正在开发一个程序,任务是从CD-ROM上读取文件,如视频和音频文件。因为每一台机器上的情况都不一样。如何知道CD-ROM驱动器呢?

[解答]

首先,一台机器可能有不止一个CD-ROM驱动器。现在CD-ROM已经是PC机的标准配置,此外再装个可擦写的光盘驱动,甚至是DVD都是很常见的事情。不管一台机器上装多少个不同的驱动器,如何找到它们呢?

有关驱动器的函数有GetLogicalDrives,GetLogicalDriveStrings和GetDriveType。前两个用来获取逻辑驱动器盘符,GetLogicalDriveStrings返回路径名字符串,如:

"A:\<null>C:\<null>F:\<null><null>"

这里每一个路径名都由NULL(空或者零)字符分隔,最后结尾是两个空字符--这是标准的C风格处理方法。对于喜欢操作位和字节的汇编语言使用者来说,GetLogicalDrives是个很好用的API函数。它以位掩码的形式返回逻辑驱动器。即在一个DWORD类型的返回值中,位0(最小的一位)表示驱动器A,位1表示驱动器B,以此类推。每一个位的状态如果是on,则表示对应的逻辑驱动器存在;否则状态为off,表示对应的逻辑驱动器不存在。大家知道DWORD是一个32位的值,足以包括所有的英文字母,也就是说最多可有26个盘符。

为了确定某个逻辑驱动器的类型,必须调用GetDriveType函数。它以路径名作为参数(如C:\),返回DRIVE_FIXED,DRIVE_REMOVABLE,或DRIVE_UNKNOWN。下面列出了所有可能返回的值:这些值在winbase.h定义

#define DRIVE_UNKNOWN   0  // 无效路径名
#define DRIVE_NO_ROOT_DIR 1  // 无效路经,如无法找到的卷标
#define DRIVE_REMOVABLE  2  // 可移动驱动器(如磁盘驱动器,光驱等)
#define DRIVE_FIXED    3  // 固定的驱动器 (如 通常的硬盘)
#define DRIVE_REMOTE    4  // 网络驱动器
#define DRIVE_CDROM    5  // CD-ROM
#define DRIVE_RAMDISK   6  // 随机存取(RAM) 磁盘

为了更容易说明问题,我写了一个小程序--ListDrives,它可以列出某台机器上所有的逻辑驱动器。其实现代码如下:ListDrives.cpp
#include "stdafx.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
using namespace std; // for string class
// 下面是一个GetDriveType返回码与人可读字符串的迷你对照表
//
struct {
  UINT type;    // GetDriveType返回码类型
  LPCSTR name;   // ascii 名称
} DriveTypeFlags [] = {
  { DRIVE_UNKNOWN,   "未知" },
  { DRIVE_NO_ROOT_DIR, "无效路经" },
  { DRIVE_REMOVABLE,  "可移动" },
  { DRIVE_FIXED,    "固定" },
  { DRIVE_REMOTE,   "网络驱动器" },
  { DRIVE_CDROM,    "CD-ROM" },
  { DRIVE_RAMDISK,   "随机存取磁盘" },
  { 0, NULL},
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
  if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
   cerr << _T("Fatal Error: MFC initialization failed") << endl;
   return -1;
  }
  // 获取逻辑驱动器字符串- a:\b:\c:\... 等.
  // 还可以用GetLogicalDrives 以位图形式代替字符串形式获取信息
  TCHAR buf[100];
  DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);
  // 显示每个驱动器的信息
  //
  string msg = "Logical Drives:\n"; // STL string
  for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) {
   LPCTSTR sDrivePath = s;
   msg += sDrivePath;
   msg += " ";
   // GetDriveType 获取枚举值,如DRIVE_UNKNOWN等.
   //
   UINT uDriveType = GetDriveType(sDrivePath);
// 查找驱动器类型。在此我用了表(结构数组)来进行查找处理,过于繁琐了一些,
// 但既然uDriveType 的值是连续的。
// 我可以用DriveTypeFlags[uDriveType]来代替线性查找。在实际的编程中通常可以这么做:
// if (uDriveType & DEVICE_CDROM) {
     ……
// }
   //
   for (int i=0; DriveTypeFlags[i].name; i++) {
     if (uDriveType == DriveTypeFlags[i].type) {
      msg += DriveTypeFlags[i].name;
      break;
     }
   }
   msg += ''''''''''''''''\n '''''''''''''''';
  }
  cout << msg.c_str();
  return 0;
}

程序代码很简单,它是一个MFC程序。用GetLogicalDriveStrings获取所有逻辑驱动器的根路径名,然后调用GetDriveType来确定每个驱动器的类型。如果你要找CD-ROM,则检查uDriveType = DRIVE_CDROM就可以了。

本文配套源码

时间: 2024-11-18 02:45:38

如何用编程获取CD-ROM的驱动器盘符的相关文章

如何通过钩子(hook)获取鼠标所选择的驱动器盘符??

问题描述 如何通过钩子获取鼠标所选择的驱动器盘符?? 解决方案 解决方案二:就是你选中之后判断??有其他方法不用HOOK的我不知道你想实现什么功能

Win7系统删除网络驱动器盘符

公司项目切换服务器,之前服务器共享的盘符没法继续使用了,于是想把网络驱动器盘符图标给删掉: 删除方法: 单击「开始」,然后单击"运行". 在"打开"框中,键入 cmd. 键入 net use Y: /delete 注意:其中 Y:是共享资源的驱动器号 命令执行完成后重启机器,搞定! 作者:jiankunking 出处:http://blog.csdn.net/jiankunking

如何使用组策略隐藏服务器或者桌面驱动器盘符

企业环境里,批量设置服务器/桌面驱动器盘符隐藏是很多管理员都需要完成的工作,大多情况下,我们会直接使用组策略批量的进行桌面PC机的盘符隐藏. 如果你真的使用过这些内置的组策略,你一定多少有一些失望,Microsoft提供的标准组策略实在是不能满足很多用户的要求,因为里面隐藏盘符的组合实在是太少了. 如果我要隐藏E盘,怎么办呢?Microsoft专门提供了一个文章来告诉管理员怎么来做,http://support.microsoft.com/kb/231289 不过相信你看到这个文章时,眉头会再次

win7怎么删除无效驱动器盘符

电脑中因为安装虚拟光驱,会产生好几个无效的驱动器盘符,即右键单击这些盘符,并无法弹出光驱, 右键菜单里也找不到删除选项.win7怎么删除无效驱动器盘符?具体的操作方法如下,感兴趣的朋友可以参考下. 方法/步骤如下: 1.点击开始菜单,右击计算机,选择管理选项卡,进入计算机管理. 2.打开计算机管理后,选择存储----磁盘管理,会看到除了硬盘外还有很多光盘驱动器盘符. 3.右击要删除的光驱盘符,选择更改驱动器号和路径.在弹出的窗口中,单机删除按钮,即可删除该无效驱动器盘符,确定保存. 4.回到计算

win8系统中多余的光盘驱动器盘符该怎么删除?

  我们该怎样删除无效的驱动器盘符,多余的盘符放电脑里看着挺乱的,该怎么删除这些无效的盘符呢?下面分享删除的方法. 按住快捷键WIN+R 打开运行输入compmgmt.msc回车 在窗口中选择"磁盘管理" 这是光盘驱动器盘符 右击要删除的光驱盘符,选择更改驱动器号和路径. 在弹出的窗口中,单机删除按钮,选择"是"即可删除该无效驱动器盘符,确定保存. 注意:不要把真实光驱盘符删除,否则会影响真实光驱的使用.判断是否真实盘符,右击选择弹出选项,若光驱弹出,则是真实盘符;

XP用户无需烦恼 驱动器盘符随心所欲

在使用新的驱动盘时用户们常常会发现系统下的驱动器盘符出现了错误,通过以下方法可以修改相应的驱动器盘符,大家一起来看看吧. 首先,在"我的电脑"上单击右键,选择"管理".出现管理的窗口. 在窗口右侧用鼠标右击"J"盘符,在快捷菜单上选择"更改驱动器名和路径",出现如所示对话框. 点击其中的"更改",出现图4对话框,在右侧的下拉框中给指定一个空余的盘符例如"Y",然后点击"确定&q

获取驱动器盘符

问题描述 如题,Eclipse中怎么获得机器中的磁盘驱动器盘符C:D:等等 解决方案 解决方案二:具体点,说的太笼统了解决方案三:取程序启动时工作目录的盘符?方法太多了,这是一个Filef=newFile("a.txt");System.out.println(f.getAbsolutePath().substring(0,2)); 解决方案四:比如说我弄个下拉框想把C:D:E:F:添加到下拉菜单里怎么获取这个C:D:E:这个盘符呢解决方案五:File[]roots=File.list

【紧急】C#怎么获取一个打开磁盘的盘符

问题描述 如果打开某一个盘(无论是鼠标还是键盘打开)..就获取那个盘的盘符.请问各位大神,这个功能要怎么做出来.. 解决方案 解决方案二:楼主先定义下什么叫做"打开某一个盘"解决方案三:是在代码中通过使用folderBrowserDialog之类的控件打开磁盘吗?这个简单.如果是是在系统中进行处理,那需要全局钩子相关的技术点还不少百度下相关操作解决方案四:引用1楼wddw1986的回复: 楼主先定义下什么叫做"打开某一个盘" 就是我们正常操作的时候打开D盘,E盘这样

win8系统下怎样隐藏指定驱动器盘符

在使用Win8系统过程中,不同用户有着不同的需求,即使一些需求很小众但也能实现.就有一些用户希望隐藏本地磁盘驱动器号,这该如何操作呢? 操作方法 1.打开文件夹选项. 2.在查看选项卡中,取消勾选显示驱动器号. 3.确定保存,本次磁盘驱动器号就被隐藏起来了.   相反,如果要让它显示出来,恢复勾选即可.