24小时热门版块排行榜    

查看: 141  |  回复: 0
当前主题已经存档。

zsglly

木虫 (著名写手)

[交流] 如何用编程获取CD-ROM的驱动器盘符?

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


[解答]  
    首先,一台机器可能有不止一个CD-ROM驱动器。现在CD-ROM已经是PC机的标准配置,此外再装个可擦写的光盘驱动,甚至是DVD都是很常见的事情。不管一台机器上装多少个不同的驱动器,如何找到它们呢?
    有关驱动器的函数有GetLogicalDrives,GetLogicalDriveStrings和GetDriveType。前两个用来获取逻辑驱动器盘符,GetLogicalDriveStrings返回路径名字符串,如:

      "A:\C:\F:\"  

    这里每一个路径名都由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.name; i++) {
         if (uDriveType == DriveTypeFlags.type) {
            msg += DriveTypeFlags.name;
            break;
         }
      }
      msg += ''''''''''''''''\n'''''''''''''''';
   }
   cout << msg.c_str();

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

[ Last edited by 幻影无痕 on 2006-11-29 at 07:46 ]
回复此楼

» 猜你喜欢

做人要厚道啊!厚道啊!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zsglly 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[文学芳草园] 梦想 +5 myrtle 2026-08-26 5/250 2026-08-31 14:40 by hahaboy
[基金申请] 中青基了要发朋友圈吗? +7 349506619 2026-08-28 7/350 2026-08-31 13:39 by 冼亮淀粉酶
[基金申请] 29号明天会评吗 +4 笨笨唐 2026-08-28 4/200 2026-08-31 09:30 by huixian257
[基金申请] 国社科又开始会评了,不知道这次命运如何 +6 雨打竹帘 2026-08-30 10/500 2026-08-31 09:29 by huixian257
[基金申请] 基金不中,共勉 +12 eulota 2026-08-26 12/600 2026-08-31 08:42 by ZJTJZ
[基金申请] 能否申诉? +6 echo8914667 2026-08-30 7/350 2026-08-31 08:41 by kingkocxr
[基金申请] 面上意见出来了 +10 黄鸟于飞Chao 2026-08-29 19/950 2026-08-31 08:01 by blueearth171
[基金申请] 有没有仍没收到信息的 +7 德尚中行 2026-08-27 8/400 2026-08-30 20:52 by purplejack
[基金申请] 国自然评审意见 +13 wangmingqi 2026-08-28 19/950 2026-08-29 10:22 by Poppy1104
[基金申请] 2026年叶企孙基金 +4 bud_bud 2026-08-27 7/350 2026-08-29 07:23 by foolishmani
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +12 Kittylucky 2026-08-27 13/650 2026-08-29 00:04 by superceng
[基金申请] 面上合作单位盖章 +5 ssyjh 2026-08-27 5/250 2026-08-27 20:50 by gdfollow
[基金申请] 基金未中,这种答复是模板吗? +5 zhaosm1982 2026-08-27 6/300 2026-08-27 16:00 by lfy8008
[基金申请] 怎么看青基中了没有啊 +5 叶九微 2026-08-26 5/250 2026-08-27 10:35 by l_zh2008
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +25 木水思豆 2026-08-25 28/1400 2026-08-26 14:53 by draco1987
[基金申请] 出来了 +9 trojank 2026-08-26 9/450 2026-08-26 14:25 by 宝贝虫子
[基金申请] 国合里面能看到了 +7 一怀馨秋 2026-08-26 7/350 2026-08-26 11:23 by zhaosm1982
[基金申请] 系统进不去 +4 yanglien 2026-08-26 5/250 2026-08-26 11:10 by wenfengw83
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
[基金申请] 国合现在查不到了吗? +10 chengyan1220 2026-08-24 20/1000 2026-08-26 08:57 by peasantsprig
信息提示
请填处理意见