首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 压缩工具
用vb获得大容量硬盘信息_visualbasic教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
这是为什么呢?熟悉Win32API编程的人都知道,在用VB编程时,我们可以用相应的API函数来获得有关系统的硬盘的信息,会不会是错在API的调用函数呢?想到这里我用自编的程序来查看PCAlert的有关文件,发现其调用了GetDiskFreeSpace函数,问题就出在这个函数上。下面是该函数的参数说明:ByvallpRootPathNameAsString(为欲查看的分区的根路径如C:\),lpSectorsPerClusterAsLong(为一簇的扇区数),lpBytesPerSectorAsLong(为每一扇区的字节数),lpNumberOfFreeClustersAsLong(当前分区中未使用的簇数),lpTotalNumberOfClustersAsLong(总的簇数)AsLong。当我们调用此函数时,是以lpBytesPerSector×lpSectorsPerCluster×TotalNumberOfClusters来计算分区总的大小的,在VB中我用来查看自己的C盘时返回值分别为512、64、65526,因而计算出的C盘的大小只有2.05G。

  以下是关于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的分区的大小,不知这辈子能否用上这么大的硬盘.

->


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·web打印的另类方法-ASP教程,打印相关
·Java简单类型进行精确浮点数运算-JSP教程,Java技巧及代码
·使用JAVAMAIL发邮件的一个例子-JSP教程,邮件相关
·中国移动本地传输网建设方案初探
·传输系统中的时钟同步技术
·JSP学习经验总结(转)-JSP教程,Jsp/Servlet
·WEB打印,去页眉和页脚-ASP教程,打印相关
·Native XML数据库技术详解-.NET教程,XML应用
·jsp生成html--readtemplates-JSP教程,Jsp/Servlet
·下拉框反回选定的文字 (修改页面经常用到)-ASP教程,ASP应用
最新文章
·在xp中如何使用windows vista屏保_windows xp
·photoshop调色:cmyk模式处理单色调特效_photoshop教程
·视频分享网站视频广告发展面临的问题_营销推广
·难以置信,这样的网站每月盈利上千万_营销推广
·大站做百度主题推广 小站做google adsense_网赚技巧
·方兴东:保留alexa插件才能给站长带来快乐_站长访谈
·网友天下ceo叶灵:欢迎大家看web2.0笑话_站长访谈
·我们应该如何运营网站_站长心得
·网站从业者还要更加务实才能赚钱_站长心得
·炼成高级网络编辑的三大原则_站长心得
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭