如何用编程获取CD-ROM的驱动器盘符
当前位置:以往代写 > C/C++ 教程 >如何用编程获取CD-ROM的驱动器盘符
2019-06-13

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

如何用编程获取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;
}

#p#分页标题#e#

措施代码很简朴,它是一个MFC措施。用GetLogicalDriveStrings获取所有逻辑驱动器的根路径名,然后挪用GetDriveType来确定每个驱动器的范例。假如你要找CD-ROM,则查抄uDriveType = DRIVE_CDROM就可以了。

本文配套源码

    关键字:

在线提交作业