当前位置: 源码素材网 » VC++教程 » 详情页

VC++判别存储设备类型并定位到光驱(软驱)

  •   时间:2019-08-08
  • 概述:定位 磁盘类型

在VC++程序设计中,经常需要判别光驱和软驱,并进行读写。本例介绍如何判别并定位到光驱(软驱)。编译并运行本例程序,如下图所示。在驱动器列表中选择不同的驱动器,静态文本框显示驱动器的类型(光驱、软驱、硬盘),列表框显示该驱动器的所有文件和活页夹。

实现方法和思路:用GetLogicalDrives 函数获得计算机中的所有驱动器,对每个驱动器用GetDriveType 函数判别驱动器的类型。其中GetDriveType 函数的返回值表示了驱动器的类型,它是下列值的一个:
DRIVE_UNKNOWN 不能决定驱动器类型。
DRIVE_NO_ROOT_DIR 不存在根目录。
DRIVE_REMOVABLE 磁盘能从驱动器中删除。
DRIVE_FIXED 磁盘不能从驱动器中删除。
DRIVE_REMOTE 驱动器是一个远程(网络)驱动器。
DRIVE_CDROM 驱动器是一个CD-ROM 驱动器。
DRIVE_RAMDISK 驱动器是一个RAM 磁盘。
以下进行代码编写:
(1)通过AppWizard 生成基于对话框的应有程序DisCdromAndFd。
(2)给对话框增加一个CComboBox 控件,用来显示计算机的所有驱动器,其ID 设为IDC_DRIVER。
(3)给对话框增加一个静态文本框,用来显示驱动器的类型,其ID 设为IDC_STATIC_TYPE。
(4)给对话框增加一个CListBox 控件,用来显示当前驱动器根目录的所有文件和活页夹,其ID 设为IDC_LIST_FILES。
(5)在对话框的头文件中增加一个结构DRVITEM,用来保存驱动器信息,其代码如下:

//定义驱动器信息结构
typedef struct drvitem
{
int nItem;
CString strDrv;
}DRVITEM;

(6)给对话框增加一个保存所有驱动器信息的数组,其定义如下:

CArray<DRVITEM,DRVITEM&>arrDrvItems; //保存所有驱动器信息

而且为了使用CArray 类,在对话框的头文件开始处增加如下代码:

#include <afxtempl.h>

(7)给对话框增加获得所有驱动器的函数FindAllDrivers,其代码如下:

//找到所有的驱动器,并在列表框中显示
void CDisCdromAndFdDlg::FindAllDrivers()
{
arrDrvItems.RemoveAll();
CComboBox* Driver=(CComboBox*)GetDlgItem(IDC_DRIVER);
DWORD dwNumBytesForDriveStrings; //实际存储驱动器号的字符串长度
HANDLE hHeap;
LPSTR lp;
CString strLogdrive;
//获得实际存储驱动器号的字符串长度
dwNumBytesForDriveStrings=GetLogicalDriveStrings(0,NULL)*sizeof(TCHAR);
//如果字符串不为空,则表示有正常的驱动器存在
if (dwNumBytesForDriveStrings!=0) {
//分配字符串空间
hHeap=GetProcessHeap();
lp=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,
dwNumBytesForDriveStrings);
//获得标明所有驱动器的字符串
GetLogicalDriveStrings(HeapSize(hHeap,0,lp),lp);
//将驱动器逐个放到下拉列表中
int nIndex = 0;
while (*lp!=0)
{
Driver->AddString(lp);
//将驱动器信息保存在数组中
DRVITEM drv;
drv.nItem = nIndex;
drv.strDrv = lp;
arrDrvItems.Add(drv);
lp=_tcschr(lp,0)+1;
nIndex++;
}
//设第一个驱动器被选择
Driver->SetCurSel(0);
OnSelchangeDriver();
}
else
AfxMessageBox("Can’t Use The Function GetLogicalDriveStrings!");
}

(8)给对话框增加辨别驱动器的函数DisDriver,其代码如下:

//辨别驱动器
void CDisCdromAndFdDlg::DisDriver(CString strDriver)
{
//获得驱动器类型
UINT DrvType = GetDriveType(strDriver);
CStatic* pTypeWnd = (CStatic*)GetDlgItem(IDC_STATIC_TYPE);
CString strType = "";
switch(DrvType)
{
case DRIVE_CDROM:
strType = "磁盘类型:光驱";
break;
case DRIVE_FIXED:
strType = "磁盘类型:硬盘";
break;
case DRIVE_REMOVABLE:
strType = "磁盘类型:软驱";
break;
default:
return;
break;
}
pTypeWnd->SetWindowText(strType);
//获得驱动器根目录的文件和活页夹
CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST_FILES);
while(pList->GetCount()>0)
pList->DeleteString(0);
CFileFind ff;
CString szDir = strDriver;
if(szDir.Right(1) != "\\")
szDir += "\\";
szDir += "*.*";
BOOL res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
if(!ff.IsDots())
{
pList->AddString(ff.GetFileName());
}
}
ff.Close();//关闭
}

(9)响应驱动器列表框IDC_DRIVER 的CBN_SELCHANGE 消息,其响应函数如下:

//当前驱动器改变了
void CDisCdromAndFdDlg::OnSelchangeDriver()
{
CComboBox* Driver=(CComboBox*)GetDlgItem(IDC_DRIVER);
//获得序号
int nSel = Driver->GetCurSel();
if(nSel>-1)
{
//获得驱动器名称
CString strDriver = arrDrvItems.GetAt(nSel).strDrv;
//辨别该驱动器
DisDriver(strDriver);
}
}

(10)在对话框的OnInitialUpdate 函数中调用FindAllDrivers 函数,其代码如下:

BOOL CDisCdromAndFdDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//其他初始化代码
//获得所有驱动器
FindAllDrivers();
return TRUE;
}

    相关内容:

    相关声明:

      若“VC++判别存储设备类型并定位到光驱(软驱)”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。