用VB获得大容量硬盘信息
这是为什么呢?熟悉Win32 API编程的人都知道,用VB编程时,我们可以使用相应的API函数来获取系统硬盘的信息。会不会是API调用函数出错了?突然想到我用自己的程序查了一下PC Alert的相关文件,发现它调用了GetDiskFreeSpace函数,问题就出在这个函数上。以下是此函数的参数:Byval lpRootPathName As String(例如,C: \)、lpSectorsPerCluster As Long(表示一个簇中的扇区数量)、lPBytesPerSector As Long(表示每个扇区中的字节数量)、LpNumberOfFreeClusters As Long(当前分区中未使用的簇的数量)、lpTotalNumberOfClusters As Long(簇的总数)。当我们调用这个函数时,我们通过lpbytespercer×lpsectorspercluster×totalnumberofclusters来计算分区的总大小。在VB中,我用它查看自己的驱动器C时,返回值分别是512,64,65526,所以计算出来的驱动器C的大小只有2.05G
以下是关于MSDN的详细描述:对于大于的2G分区,GetDiskFreeSpace函数可能(什么可能,一定是!)返回错误的值。此时,该函数将屏蔽lpNumberOfFreeClusters和lpTotalNumberOfClusters中存在的值。因此,建议不要使用该功能获取大于2G的分区信息。对于大于2G的分区,应该使用GetDiskFreeSpaceEx函数(从Win95 OEM OSR2开始),它可以返回关于分区的正确信息。
发现问题就可以对症下药,就是把getdiskfreespace函数替换成GetDiskFreeSpace函数。以下是GetDiskFreeSpaceEx函数中要传递的参数。
LpRootPathName String,不包括卷名的磁盘根路径名
lpfreebytesavailable local large _ integer,指定一个变量,用于保存调用者可用的字节数
lptotalbumberofbytes large _ integer,指定一个变量,用于保存磁盘上的总字节数
lptotalbumberoffreebytes large _ integer,指定一个变量,用于保存磁盘上可用的字节数。
私有类型LARGE _ INTEGER
low part As Long
high part As Long
End类型
我们可以看到LARGE_INTEGER是由两个long类型组成的类型,这两个类型都表示无符号数。转换时要定义单个变量,使其等于high part *(2 ^ 32-1)+low part。注意,这里的两个long类型相当于C/C++中的无符号整数类型,因为VB中不存在这种类型。【我的做法是先判断长变量的正负,如果是正的就直接相乘,如果是负的就从2 ^ 32-1中减去数值再相乘(具体算法见下面的代码)。
Option Explicit
私有类型LARGE _ INTEGER
low part As Long
high part As Long
End Type
私有声明函数GetDiskFreeSpace Lib "kernel32 "别名" GetDiskFreeSpaceA "(ByVal lproot pathname为String,lpSectorsPerCluster为Long,lpBytesPerSector为Long,lpNumberOfFreeClusters为Long,lpTotalNumberOfClusters为Long)
private Declare Function GetDiskFreeSpaceEx Lib " kernel 32 " Alias " GetDiskFreeSpaceExA " _
(ByVal lproot pathname为String,lpFreeBytesAvailableToCaller为LARGE_INTEGER,_
lpTotalNumberOfBytes为LARGE_INTEGER,lpTotalNumberOfFreeBytes _
为LARGE _ INTEGER)Long
private Sub command 1 _ Click()
Dim LNG sectors &
Dim lngTotalCluster &
Dim lngPerCluster &
Dim lngperBytes &
Dim LNG size #
get disk free space " c:\ ",lngPerCluster,lngperBytes,lngFreeCluster,lngTotalCluster
MsgBox CStr(lngTotalCluster * lngperBytes * lngPerCluster)
Debug。打印lngTotalCluster,lngperBytes,lngPerCluster
End Sub
Private类型LARGE _ INTEGER
low part As Long
high part As Long
End Type
Private Declare函数GetDiskFreeSpace Lib "kernel32 "别名" GetDiskFreeSpaceA "(ByVal lproot pathname为String,lpSectorsPerCluster为Long,lpBytesPerSector为Long,lpNumberOfFreeClusters为Long,lpTotalNumberOfClusters为Long
0条评论