巧用API函数检测驱动器信息

Author: 赵玉勇 刘学农 Date: 2001年 12期

    磁盘驱动器在我们的机器中太重要了,我们各种有用的没用的信息可全得靠它存储,可有时对陌生的机器陌生的环境,我们又往往对它们一无所知。在这里,我们向大家介绍如何用API函数检测驱动器信息,而在B9版,我们会以VC++编程控制光驱为例,讲解如何控制驱动器。
      API(Application Program Interface,应用程序接口)函数可以帮助我们实现一些与系统和硬件相关的操作,大大简化我们的编程工作,实现许多我们梦寐以求而有时却往往又无处下手的功能。
      下面的小程序将可用来实现对本机所有磁盘驱动器类型和名称的检索,并将所有硬盘的容量信息显示出来。
  #1    一、两个API函数
      本程序中主要用到两个API函数,一个是GetDriveType,另一个是GetDiskFreeSpace。GetDriveType是用来检测驱动器类型的,一共返回6种类型,包含了驱动器的5种类型和非驱动器。如果返回值为1,则表示该盘符不是一个磁盘驱动器,其它5种分别是:
      DRIVE_REMOVABLE=2,可移动式磁盘,通常是软盘;
      RIVE_FIXED=3,不可移动式磁盘,通常指本地硬盘;
      DRIVE_REMOTE=4,远程驱动器,或者网络驱动器;
      DRIVE_CDROM=5,光驱;
      DRIVE_RAMDISK=6,RAM驱动器。
      GetDiskFreeSpace的作用是获取磁盘组织和容量有关的信息,我们可通过柱头(Cluster)、扇区(Sector)和每扇区字节数来计算相关的容量信息。
      其中lpRootPathName表示不包括目录的磁盘根路径名;lpSectorsPerCluster表示每柱头的扇区数,lpBytesPerSector表示每扇区的字节数,lpNumberOfFreeClusters表示每柱头未用扇区数,lpTtoalNumberOfClusters表示所有柱头,不管用已用的还是未用的。
      API函数可从API Text Viewer(API阅览器)中找出其声明部分,也可自己从键盘录入。
  #1    二、实现过程
      1.通过循环语句将所有可能驱动器遍历并选择6种情况中的一种。遍历的过程中,由于必须输入“C:”的形式,我们可以通过字母的ASCII码值来实现循环。我们知道,大写字母A~Z的ASCII码值为65~90,需通过CHR(i)函数来将数字转成字母,但假设直接将CHR(i)放入“”中而形成“CHR(i):”,则CHR()将被视为普通的字符而不是一个函数,所以我们可通过disk=Chr(i+65)+Chr(58)+Chr(92)这个字符变量来传递各磁盘信息。
      2.对硬盘信息进行特殊处理,硬盘信息主要涉及各量的运算及关系:磁盘总容量=柱头数*每柱头扇区数*每扇区字节数;磁盘自由空间=柱头数*每柱头未用扇区数*每扇区字节数;已用空间=磁盘总容量-磁盘自由空间。在程序中我们仅仅对磁盘总容量进行了计算。
      3.在文本框内的换行可通过“vbCr+vbLf”来控制,它们分别表示控制键和光标左移键。
  #1    三、源程序
      Private Declare Function GetDiskFreeSpace Lib “kernel32” Alias “GetDiskFreeSpaceA”(ByVal lpRootPathName As String,lpSectorsPerCluster As Long,lpBytesPerSector As Long,lpNumberOfFreeClusters As Long,lpTtoalNumberOfClusters As Long) As Long
      'lpRootPathName 不包括目录的磁盘根路径名
      'lpSectorsPerCluster 每柱头的扇区数
      'lpBytesPerSector 每扇区的字节数
      'lpNumberOfFreeClusters 未用扇区数
      'lpTtoalNumberOfClusters 所有扇区数
      Private Declare Function GetDriveType Lib “kernel32” Alias “GetDriveTypeA”(ByVal nDrive As String) As Long
      Private Const DRIVE_REMOVABLE=2 '可移动式硬盘,通常是软盘
      Private Const DRIVE_FIXED=3 '不可移动式硬盘,通常指本地硬盘
      Private Const DRIVE_REMOTE=4 '远程驱动器
      Private Const DRIVE_CDROM=5 '光驱
      Private Const DRIVE_RAMDISK=6 'RAM驱动器
      Dim Number As Integer
      Dim lpSPC,lpBPS,lpNOfFC, lpTNOfC As Long
      Dim disk As String
      Dim TotalBG,M As Double
      Private Sub CmdDr_Click()
      Dim Temp,TotalB As Long
      a=1024
      M=a*a*a
      TxtTestmes.Text=“” '重置文本输出
      Number=0
      Dim Dr_Value As Long
      For I=0 To 25
      Disk=Chr(i+65)+Chr(58)+Chr(92)
      Dr_Value=GetDriveType(disk) '遍历盘符
      Select Case Dr_Value '判断驱动器类型
      Case DRIVE_REMOVABLE
      Number=Number+1
      TxtTestmes.Text=TxtTestmes.Text+Str(Number)+“所测软驱符号为:”+Chr(i+65)+vbCr+vbLf
      Case DRIVE_FIXED
      Temp= GetDiskFreeSpace(disk,lpSPC,lpBPS,lpNOfFC,lpTNOfC)
      TotalB=lpSPC*lpBPS*lpTNOfC
      TotalBG=TotalB/M
      Number=Number+1
      TxtTestmes.Text=TxtTestmes.Text+ Str(Number)+“所测硬盘符号为:”+Chr(i+65)
      TxtTestmes.Text=TxtTestmes.Text+“硬盘总容量为:”+Str(TotalB)+“字节,即”+Str(TotalBG)+“G”+vbCr+vbLf
      Case DRIVE_REMOTE
      Number=Number+1
      TxtTestmes.Text=TxtTestmes.Text+Str(Number)+“所测网络驱动器符号为:”+Chr(i+65)+vbCr+vbLf
      Case DRIVE_CDROM
      Number=Number+1
      TxtTestmes.Text=TxtTestmes.Text+Str(Number)+“所测光驱符号为:”+Chr(i+65)+vbCr+vbLf
      Case DRIVE_RAMDISK
      Number=Number+1
      TxtTestmes.Text=TxtTestmes.Text+Str(Number)+“所测RAM驱动器为:”+Chr(i+65)+vbCr+vbLf
      Case Else
      End Select
      Next i
      End Sub
      Private Sub CmdExit_Click()
      Unload Me '退出
      End Sub
      Private Sub Form_Load()
      LblTestE.Caption=“检测结果:”
      TxtTestmes.Text=“”
      CmdDr.Caption=“检测驱动器”
      TxtTestmes.SelStart=0
      CmdExit.Caption=“退出”
      End Sub