用VB获得大容量硬盘信息
添加时间: 2006-2-15 3:52:48 作者: VB教程 阅读次数:115 来源: http://www.d9soft.com
一天刚刚下网,无聊之际打开了该工具查看自己的硬盘信息(在Win98下),我的硬盘是西部数据(Western Digital)20.5G的,其分区情况如下:C:4.0G(用来装Win98)、D:4.0G(用于Win2000)、E:5.0G(数据)、F:5.0G(数据)、G:剩余的容量(用于备份)。可是在显示时却出现这样的信息:C:D:E:F:盘的大小变成了2.05G(到后面可以知道只要分区大于2G的都不会显示正常的大小)。
这是为什么呢?熟悉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(总的簇数) As Long。当我们调用此函数时,是以lpBytesPerSector×lpSectorsPerCluster×TotalNumberOfClusters来计算分区总的大小的,在VB中我用来查看自己的C盘时返回值分别为512 、64、 65526,因而计算出的C盘的大小只有2.05G。
以下是关于MSDN中的有关详细说明:对于大于的2G分区,GetDiskFreeSpace函数可能(什么可能,是一定!)返回错误的值,此时函数会屏蔽存在lpNumberOfFreeClusters及lpTotalNumberOfClusters中的值,因此建议不要用该函数来获得大于2G分区的信息。对于大于2G的分区应当使用GetDiskFreeSpaceEx函数(从Win95 OEM OSR2开始),此函数可以返回分区的有关正确信息。
找到了问题所在便可以对症下药了,即用GetDiskFreeSpaceEx函数代替GetDiskFreeSpace函数即可。以下是GetDiskFreeSpaceEx函数中所要传递增的参数
lpRootPathName String ,不包括卷名的磁盘根路径名
lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
lpTotalNumberOfBytes LARGE_INTEGER ,指定一个变量,用于容纳磁盘上的总字节数
lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数
Private Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type
Private Sub cmdStart_Click()
注释:用GetDiskFreeSpaceEx得到正确的容量
Dim lngFreeCaller As LARGE_INTEGER
Dim lngTotal As LARGE_INTEGER
Dim lngTotalFree As LARGE_INTEGER
Dim sngSize#
GetDiskFreeSpaceEx "c:\", lngFreeCaller, lngTotal, lngTotalFree
注释:以下用来显示出分区总容量(以G为单位)
MsgBox GetSize(lngTotal) / 2 ^ 30
End Sub
Private Function GetSize(lngSize As LARGE_INTEGER) As Single
注释:用来从LARGE_INTEGER型变量中换算出实际的大小
With lngSize
If .highpart < 0 Then
GetSize = (2 ^ 32 - 1 - .highpart) * (2 ^ 32 - 1)
Else
GetSize = .highpart * (2 ^ 32 - 1)
End If
If .lowpart < 0 Then
GetSize = GetSize + (2 ^ 32 - 1 - .lowpart)
Else
GetSize = GetSize + .lowpart
End If
End With
End Function
Private Function GetSize(lngSize As LARGE_INTEGER) As Single
注释:用来从LARGE_INTEGER型变量中换算出实际的大小
With lngSize
If .highpart < 0 Then
GetSize = (2 ^ 32 - 1 - .highpart) * (2 ^ 32 - 1)
Else
GetSize = .highpart * (2 ^ 32 - 1)
End If
If .lowpart < 0 Then
GetSize = GetSize + (2 ^ 32 - 1 - .lowpart)
Else
GetSize = GetSize + .lowpart
End If
End With
End Function
从LARGE_INTEGER的定义来看,应用此函数理论上可得到2^64/2^30=2^34G的分区的大小,不知这辈子能否用上这么大的硬盘
上一篇文章: VB:怎样将查询结果导出到Excel 下一篇文章: VB程序实现WindowsXP效果的界面
相关文章:

