- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安VB教程基地 来源:黑客防线网安VB教程基地 浏览次数:0 |
以下是关于MSDN中的有关详细说明:对于大于的2G分区,GetDiskFreeSpace函数可能(什么可能,是一定!)返回错误的值,此时函数会屏蔽存在lpNumberOfFreeClusters及lpTotalNumberOfClusters中的值,因此建议不要用该函数来获得大于2G分区的信息。对于大于2G的分区应当使用GetDiskFreeSpaceEx函数(从Win95OEMOSR2开始),此函数可以返回分区的有关正确信息。
找到了问题所在便可以对症下药了,即用GetDiskFreeSpaceEx函数代替GetDiskFreeSpace函数即可。以下是GetDiskFreeSpaceEx函数中所要传递增的参数
lpRootPathNameString ,不包括卷名的磁盘根路径名
lpFreeBytesAvailableToCallerLARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
lpTotalNumberOfBytesLARGE_INTEGER ,指定一个变量,用于容纳磁盘上的总字节数
lpTotalNumberOfFreeBytesLARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数
PrivateTypeLARGE_INTEGER
lowpartAsLong
highpartAsLong
EndType
我们可以看到LARGE_INTEGER是一个由两个long型组成的一个类型,两个long组成表示的都是无符号的数,在转换时应当定义一个single型的变量,使其等于highpart*(2^32-1) lowpart,注意此处的两个long型相当于C/C 中的无符号型整数类型,因为在VB中不存在此种类型,故而在换算时要处理好转换关系。我本人的做法是首先判断long型变量的正负,如是正直接相乘,如是负则用2^32-1减去该值再相乘(具体算法详见下面的代码)。
OptionExplicit
PrivateTypeLARGE_INTEGER
lowpartAsLong
highpartAsLong
EndType
PrivateDeclareFunctionGetDiskFreeSpaceLib"kernel32"Alias"GetDiskFreeSpaceA"(ByVallpRootPathNameAsString,lpSectorsPerClusterAsLong,lpBytesPerSectorAsLong,lpNumberOfFreeClustersAsLong,lpTotalNumberOfClustersAsLong)AsLong
PrivateDeclareFunctionGetDiskFreeSpaceExLib"kernel32"Alias"GetDiskFreeSpaceExA"_
(ByVallpRootPathNameAsString,lpFreeBytesAvailableToCallerAsLARGE_INTEGER,_
lpTotalNumberOfBytesAsLARGE_INTEGER,lpTotalNumberOfFreeBytes_
AsLARGE_INTEGER)AsLong
PrivateSubCommand1_Click()
DimlngSectors&
DimlngTotalCluster&
DimlngFreeCluster&
DimlngPerCluster&
DimlngperBytes&
DimlngSize#
GetDiskFreeSpace"c:",lngPerCluster,lngperBytes,lngFreeCluster,lngTotalCluster
MsgBoxCStr(lngTotalCluster*lngperBytes*lngPerCluster)
Debug.PrintlngTotalCluster,lngperBytes,lngPerCluster
EndSub
PrivateTypeLARGE_INTEGER
lowpartAsLong
highpartAsLong
EndType
PrivateDeclareFunctionGetDiskFreeSpaceLib"kernel32"Alias"GetDiskFreeSpaceA"(ByVallpRootPathNameAsString,lpSectorsPerClusterAsLong,lpBytesPerSectorAsLong,lpNumberOfFreeClustersAsLong,lpTotalNumberOfClustersAsLong)AsLong
PrivateDeclareFunctionGetDiskFreeSpaceExLib"kernel32"Alias"GetDiskFreeSpaceExA"_
(ByVallpRootPathNameAsString,lpFreeBytesAvailableToCallerAsLARGE_INTEGER,_
lpTotalNumberOfBytesAsLARGE_INTEGER,lpTotalNumberOfFreeBytes_
AsLARGE_INTEGER)AsLong
PrivateSubCommand1_Click()
注释:用GetDiskFreeSpace得到错误的容量
DimlngSectors&
DimlngTotalCluster&
DimlngFreeCluster&
DimlngPerCluster&
DimlngperBytes&
DimlngSize#
GetDiskFreeSpace"c:",lngPerCluster,lngperBytes,lngFreeCluster,lngTotalCluster
MsgBoxCStr(lngTotalCluster*lngperBytes*lngPerCluster)
EndSub
PrivateSubcmdStart_Click()
注释:用GetDiskFreeSpaceEx得到正确的容量
DimlngFreeCallerAsLARGE_INTEGER
DimlngTotalAsLARGE_INTEGER
DimlngTotalFreeAsLARGE_INTEGER
DimsngSize#
GetDiskFreeSpaceEx"c:",lngFreeCaller,lngTotal,lngTotalFree
注释:以下用来显示出分区总容量(以G为单位)
MsgBoxGetSize(lngTotal)/2^30
EndSub
PrivateFunctionGetSize(lngSizeAsLARGE_INTEGER)AsSingle
注释:用来从LARGE_INTEGER型变量中换算出实际的大小
WithlngSize
If.highpart<0Then
GetSize=(2^32-1-.highpart)*(2^32-1)
Else
GetSize=.highpart*(2^32-1)
EndIf
If.lowpart<0Then
GetSize=GetSize (2^32-1-.lowpart)
Else
GetSize=GetSize .lowpart
EndIf
EndWith
EndFunction
PrivateFunctionGetSize(lngSizeAsLARGE_INTEGER)AsSingle
注释:用来从LARGE_INTEGER型变量中换算出实际的大小
WithlngSize
If.highpart<0Then
GetSize=(2^32-1-.highpart)*(2^32-1)
Else
GetSize=.highpart*(2^32-1)
EndIf
If.lowpart<0Then
GetSize=GetSize (2^32-1-.lowpart)
Else
GetSize=GetSize .lowpart
EndIf
EndWith
EndFunction
从LARGE_INTEGER的定义来看,应用此函数理论上可得到2^64/2^30=2^34G的分区的大小,不知这辈子能否用上这么大的硬盘.
->我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |