关于得到CD-ROM的盘符的问题
来源:互联网 发布:花生壳和阿里云 编辑:程序博客网 时间:2024/05/16 10:13
[提出问题]
最近我正在开发一个程序,任务是从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 // 无效路径名
为了更容易说明问题,我写了一个小程序--ListDrives,它可以列出某台机器上所有的逻辑驱动器。其实现代码如下:
#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.cpp
程序代码很简单,它是一个MFC程序。用GetLogicalDriveStrings获取所有逻辑驱动器的根路径名,然后调用GetDriveType来确定每个驱动器的类型。如果你要找CD-ROM,则检查uDriveType = DRIVE_CDROM就可以了。
#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::c:... 等.
// 还可以用GetLogicalDrives 以位图形式代替字符串形式获取信息
TCHAR buf[100];
DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);
// 显示每个驱动器的信息
//
string msg = "Logical Drives:
"; // 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 += ''''''''''''''''
'''''''''''''''';
}
cout << msg.c_str();
return 0;
}
- 关于得到CD-ROM的盘符的问题
- 如何用编程获取CD-ROM的驱动器盘符?
- 如何确定CD-ROM驱动器的盘符?
- cd-rom无法读盘的原因
- HP CD-ROM/DVD ROM的使用
- 关于ROM BIOS的启动问题
- U盘安装Ubuntu14.04 server版 提示无法挂载cd-rom数据的解决办法
- Linux上一个和CD-ROM相关的错误
- 【xinfanqie】不为人知的U盘量成CD-ROM小技巧
- dvd cd rom 出现黄色叹号的解决方法
- 来宾操作系统已锁定CD-ROM的大门
- Dell服务器上安装ubuntu或者其他linux系统引导盘出现no common cd-rom drive detected问题的处理
- 关于ROM BIOS的启动问题1234››
- 关于手机rom、ram、internal storage的问题?
- 关于patch ROM最后签名的问题。
- 关于freeMarker得到list长度的问题
- 关于freeMarker得到list长度的问题
- 关于freeMarker得到list长度的问题
- 工作日志——2009-08-28
- 砍头砍尾
- C# char 和string之间转换
- VMWare 6.0桥接模式虚拟机网络配置
- 往事不堪回首--记公司软件项目开发过程
- 关于得到CD-ROM的盘符的问题
- Portal 扫盲篇
- 自己动手做一个迷你Linux 系统
- Oralce PLSQL中“&”的处理。
- Eclipse使用技巧
- 什么是内存
- 品读人生
- WINDOWS下配置APACHE+PHP+MYSQL+ZEND OPTIMIZER+PHPMYADMIN
- 再谈WEB标准