打印本文 打印本文  关闭窗口 关闭窗口  
调用DLL获取磁盘结构信息
作者:佚名  文章来源:不详  点击数  更新时间:2008/5/24 20:04:54  文章录入:杜斌  责任编辑:杜斌

  在编程时我们经常需要用到系统中可用磁盘的一些信息,在Visual FoxPro中可用DiskSpace()、Sys(2022)得到剩余空间和簇大小,但如果需要磁盘组织的其他一些信息如卷标、序列号等,这些信息直接使用VFP提供的函数显然是无法得到的。本文介绍访问动态链接库,调用DLL函数GetLogicalDriverStrings、GetDriveType、GetVolumeInformation和GetDiskFreeSpace来获得磁盘组织的重要信息的方法,以便在文件创建、软件注册时加以应用。这四个函数的主要功能如下:

  GetLogicalDriverStrings: 用以获取可用磁盘代码(盘符),包括硬盘的逻辑分区。

  GetDriveType: 用以获得磁盘类型,以区别是软驱、硬盘、网络驱动器、CDROM还是RAM虚拟盘。

  GetVolumeInformation: 用以获取包括磁盘卷标、序列号、文件名每个部分(如路径中“\”与“\”之间部分的最大长度)、文件系统的某些特性等与磁盘卷有关的信息。

  GetDiskFreeSpace: 用以获取磁盘上每簇扇区数、每扇区字节数、剩余簇数、总簇数等与磁盘组织有关的信息。

  这四个函数均包含在%SystemRoot%\System32\

  Kernel32.dll中,在调用时,需先用DECLARE命令注册DLL函数,并指定参数的数目和类型,也可以在参数前添加“@”来强制参数按引用传递。函数的名称要区分大小写,并指定WIN32API为库名称。Visual FoxPro将到Kernel32.dll中自动查找被调用的32位Windows DLL函数。如图1所示,运行TEST表单即可扫描当前系统上所有可用盘符,并出现在盘符下拉框中。下面介绍其具体实现方法。

  创建表单

  创建表单并在Form的Activate过程中添加代码,添加的代码如下:

  ※ 获得当前系统上所有可用磁盘代码,并作为Form中盘符组合框的数值

  PUBLIC sAllDrivers, sAvaiDsk

  DECLARE INTEGER GetLogicalDriveStrings IN Win32api AS GetLogDsk INTEGER nBufferLength, STRING lpBuffer

  IngRetVal=0

  sAllDrivers = SPACE(128)

  &&获得所有可用磁盘代码

  lngRetVal = GetLogDsk(LEN(sAllDrivers), @sAllDrivers)

  CLEAR DLLS

  sAllDrivers=TRIM(sAllDrivers)

  ※ sAllDrivers=“A:\ B:\ C:\……”,盘符之间原用chr(0)分隔的,改用“,”间隔

  sAllDrivers=CHRTRAN(sAllDrivers,CHR(0),“,”)

  THISFORM.sAllDsk.VALUE=sAllDrivers

  THISFORM.combo1.ADDITEM(sAllDrivers)

  && 将可用盘符添加到combo1的选项中.

  在此可将不同磁盘类型对应的图标(或位图)添加到盘符符组合框combo1.picture属性中,如图1所示,图中可见带图标的组合下拉框列表,代码此略。

  查询磁盘信息

  如果要在盘符下拉框中选择任一可用盘,立即显示其结构信息,如图2所示,这需要在盘符组合框combo1的Click中添加如下代码:

  strDrive=TRIM(THISFORM.combo1.VALUE)+“\”

  DECLARE INTEGER GetDriveType IN win32api AS GetDrType STRING nDrive

  DIMENSION DskType(5)

  && 下面判断磁盘类型

  Dsktype(1)=“软盘”

  && GetDrType(strDrive)=2

  >Dsktype(2)=“硬盘”

  && GetDrType(strDrive)=3

  Dsktype(3)=“网络驱动器”

  && GetDrType(strDrive)=4

  Dsktype(4)=“CDROM”

  && GetDrType(strDrive)=5

  Dsktype(5)=“RAM虚拟驱动器”

  && GetDrType(strDrive)=6

  THISFORM.text2.VALUE=DskType(GetDrType(strDrive)-1)

  下面的代码用来取得磁盘卷信息:

  DECLARE INTEGER GetVolumeInformation IN Win32api AS GetVolInfo ;

  STRING lpRootPathName ,STRING lpVolumeNameBuffer,INTEGER nVolumeNameSize,;

  INTEGER @lpVolumeSerialNumber, INTEGER @lpMaximumComponentLength ,;

  INTEGER @lpFileSystemFlags , STRING lpFileSystemNameBuffer,;

  INTEGER nFileSystemNameSize

  STORE 0 TO VolSerialNum,MaxComLen,FSysFlag,IngRetVal

  VolLabel = REPLACE(CHR(0),255)

  FSysNameBuf= REPLACE(CHR(0),255)

  IngRetVal = GetVolInfo (strDrive, @VolLabel, LEN(VolLabel), @VolSerialNum, @MaxComLen, @FSysFlag, @FSysNameBuf, LEN(FsysNameBuf) )

  THISFORM.text3.VALUE=TRIM(VolLabel)/p>

  &&磁盘卷标

  THISFORM.text4.VALUE= VolSerialNum

  &&磁盘序列号

  THISFORM.text5.VALUE=TRIM(FSysNameBuf)

  &&文件系统FAT、FAT32、NTFS、CDFS等

  THISFORM.text7.VALUE= MaxComLen

  &&文件名成分长度

  下面的代码判断文件系统名称及卷特性

  ※ FSysFlag装载了一个或多个二进制位标志,以下是这些标志位的意义

  FS_Case_Is_Preserved=0x0002

  &&文件名的大小写保持写入时的状态

  FS_Case_Sensitive=0x0001 /p>

  &&文件名中要区别大小写

  FS_Unicode_Stor_On_Disk=0x0004

  &&文件名支持Unicode格式

  FS_Persistent_ACLS=0x0008

  &&文件系统支持访问控制列表(ACL)安全机制

  FS_File_Compression=0x0010

  &&文件系统支持逐文件地进行文件压缩

  FS_Vol_Is_Preserved=0x8000

  &&整个磁盘卷都是压缩的

  FSysFtmp=“”

  FSysFtmp=iif(bitand(FSysFlag,FS_Case_Is_Preserved)>0,FSysFtmp+“文件名的大小写保持写入时的状态”+chr(13),FSysFtmp)

  FSysFtmp=iif(bitand(FSysFlag,FS_Case_Sensitive)>0,FSysFtmp+“文件名中要区别大小写”+chr(13),FSysFtmp)

  FSysFtmp=iif(bitand(FSysFlag,FS_Unicode_Stor_On_Disk)>0,FSysFtmp+“文件名支持为Unicode格式”+chr(13),FSysFtmp)

  FSysFtmp=iif(bitand(FSysFlag,FS_Persistent_ACLS)>0,FSysFtmp+“文件系统支持ACL安全机制”+chr(13),FSysFtmp)

  FSysFtmp=iif(bitand(FSysFlag,FS_File_Compression)>0,FSysFtmp+“文件系统支持逐文件地进行文件压缩”+chr(13),FSysFtmp)

  FSysFtmp=iif(bitand(FSysFlag ,FS_Vol_Is_Preserved)>0,FSysFtmp+“整个磁盘卷都是压缩的”+chr(13),FSysFtmp)

  THISFORM.text6.VALUE=FSysFtmp

  获取磁盘组织信息

  DECLARE INTEGER GetDiskFreeSpace IN Win32api;

  STRING lpRootPathName,INTEGER @lpSectorsPerCluster,;

  NTEGER @lpBytesPerSector,INTEGER @lpNumberOfFreeClusters,;

  INTEGER @lpTtoalNumberOfClusters

  STORE 0 TO SectorsPerCluster, BytesPerSector, NumberOfFreeClusters, TotalClusters

  INGRETVAL = GetDiskFreeSpace(strDrive, @SectorsPerCluster, @BytesPerSector, @NumberOfFreeClusters, @TotalClusters)

  IF INGRETVAL <> 0

  THISFORM.text8.VALUE=SectorsPercluster

  THISFORM.text9.VALUE=BytesPerSector

  THISFORM.text10.VALUE

  =NumberofFreeClusters

  THISFORM.text11.VALUE=Totalclusters

  THISFORM.DskFreeSpace.VALUE= SectorsPerCluster * BytesPerSector * NumberOfFreeClusters && 磁盘剩余空间

  THISFORM.DskTotalSpace.VALUE = SectorsPerCluster * BytesPerSector *TotalClusters

  ** 磁盘总空间

  ENDIF

打印本文 打印本文  关闭窗口 关闭窗口