计算磁盘剩余空间时溢出,怎么解决?

leisurecloud 2003-01-02 07:44:52
计算磁盘剩余空间时溢出,怎么解决?


Dim Sectors As Long, Bytes As Long, FreeC As Long, TotalC As Long, Total As Long, Freeb As Long

GetDiskFreeSpace left(App.path, 3), Sectors, Bytes, FreeC, TotalC
Freeb = FreeC * Sectors * Bytes
...全文
95 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
suntt 2003-01-06
GetDiskFreeSpaceEx

VB声明
Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long
说明
获取与一个磁盘的组织以及剩余空间容量有关的信息
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpRootPathName String,不包括卷名的磁盘根路径名
lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
lpTotalNumberOfBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数
lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数
适用平台
Windows 95 OSR2,Windows NT 4.0
注解
LARGE_INTEGER结构与FILETIME结构在内部完全一致。正式调用前,用GetVersionEx判断函数是否得到了支持。在Windows 95 OSR2环境中,OSVERSIONINFO结构的dwBuildNumbe字段会大于1000


Top

回复
of123 2003-01-03
计算容量超过2GB磁盘剩余空间:
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As Currency, lpTotalNumberOfBytes As Currency, lpTotalNumberOfFreeBytes As Currency) As Long
Public Sub GetFreeSpace(strDrv As String)
Dim r As Long
Dim BytesFreeToCalller As Currency
Dim TotalBytes As Currency
Dim TotalFreeBytes As Currency
Dim TotalBytesUsed As Currency
Call GetDiskFreeSpaceEx(strDrv, BytesFreeToCalller, TotalBytes, TotalFreeBytes)
MsgBox "Total Number of Bytes: " & Format$(TotalBytes * 10000,"###,###,###,##0")
MsgBox "Total Free Bytes: " & Format$(TotalFreeBytes * 10000,"###,###,###,##0")
MsgBox "Free Bytes Available: " & Format$(BytesFreeToCalller * 10000,"###,###,###,##0")
MsgBox "Total Space Used: " & Format$((TotalBytes - TotalFreeBytes) * 10000, "###,###,###,##0")
End Sub
回复
microyzy 2003-01-03
212、如何求出磁盘大小及剩余空间大小 (含大于 2GB 的正确算法);

在问题:如何求出磁盘大小及剩余空间大小
我们使用了 GetDiskFreeSpace API 来求出磁盘大小及剩余空间大小,
在问题:如何求出磁盘大小及剩余空间大小 (更简单的 VB6 新功能)
我们使用了 FileSystemObject 来求出磁盘大小及剩余空间大小,

如果网友自己曾经实际测试过这二个主题的程序码,而您的硬盘又大于 2GB 时,或许您会发现,只要大于 2GB 的部份都无法正确的显示!为什么会这样呢?这是因为目前 VB 只支持到 32 位的 Integer 资料型态,所以最大值就是 2GB!

要解决这个问题,您必须改用另一个 API GetDiskFreeSpaceEx,不过,在这个 API 中,有使用了一个新的 ULARGE_INTEGER Structure,所以在声明 GetDiskFreeSpaceEx API 之前,您也必须要先声明 ULARGE_INTEGER Type:

Type ULARGE_INTEGER
LowPart As Long
HighPart As Long
End Type

Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" _
Alias "GetDiskFreeSpaceExA" _
(ByVal lpDirectoryName As String, _ ´目录名称或磁盘代码
lpFreeBytesAvailableToCaller As ULARGE_INTEGER, _ ´剩余可用空间大小 (Bytes)
lpTotalNumberOfBytes As ULARGE_INTEGER, _ ´磁盘总空间大小 (Bytes)
lpTotalNumberOfFreeBytes As ULARGE_INTEGER) As Long ´剩余总空间大小 (Bytes)

ULARGE_INTEGER Structure 是一个 VB 预设中尚未支持的 64 位的 Integer,它的范围是从 &H0 到 &HFFFFFFFFFFFFFFFF (也就是 2 的 64 次方),它可用于所有尚未支持 64 位的 Integer 的程序语言中。它将 64 位的值切割成二个 32 位的部份,也就是 LowPart 及 HighPart。如果那一天 VB 开始支持 64 位的 Integer 资料型态,ULARGE_INTEGER Structure 就用不到了,否则,您一定要记得声明!

在模组中声明了上面的 Type ULARGE_INTEGER 及 GetDiskFreeSpaceEx API 之后,我们来看看以下的范例程序:


Source Code 下载

Private Sub Command1_Click()
Dim userbytes As ULARGE_INTEGER ´ 目前 User 可用磁盘空间
Dim totalbytes As ULARGE_INTEGER ´ 磁盘总空间
Dim freebytes As ULARGE_INTEGER ´ 磁盘剩余总空间
Dim retval As Long ´ GetDiskFreeSpaceEx 的返回值

If Text1.Text = "" Then Text1.Text = "C"
retval = GetDiskFreeSpaceEx(Text1.Text & ":\", userbytes, totalbytes, freebytes)
´
If userbytes.LowPart 〈 0 Then
User 可用磁盘空间 = Format((userbytes.HighPart * (16 ^ 8)) + (userbytes.LowPart + (16 ^ 8)), "#,###")
Else
User 可用磁盘空间 = Format((userbytes.HighPart * (16 ^ 8)) + userbytes.LowPart, "#,###")
End If
´
If totalbytes.LowPart 〈 0 Then
磁盘总空间 = Format((totalbytes.HighPart * (16 ^ 8)) + (totalbytes.LowPart + (16 ^ 8)), "#,###")
Else
磁盘总空间 = Format((totalbytes.HighPart * (16 ^ 8)) + totalbytes.LowPart, "#,###")
End If
´
If freebytes.LowPart 〈 0 Then
磁盘剩余总空间 = Format((freebytes.HighPart * (16 ^ 8)) + (freebytes.LowPart + (16 ^ 8)), "#,###")
Else
磁盘剩余总空间 = Format((freebytes.HighPart * (16 ^ 8)) + freebytes.LowPart, "#,###")
End If
´
Text1.SelStart = 0
Text1.SelLength = Len(Text1)
End Sub


注意:以上的功能有以下 OS 本身的限制

Windows 95 必须在 OSR2 或以后的版本才行!
Windows NT 必须在 4.0 以后的版本才行!
回复
microyzy 2003-01-03
看看这个
http://edu.yn.cninfo.net/T_examination/news/14/01-4-6/news_4751_0.shtml
回复
microyzy 2003-01-03
使用GetDiskFreeSpaceEx
回复
suntt 2003-01-03
GetDiskFreeSpace

VB声明
Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long
说明
获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpRootPathName String,不包括卷名的一个磁盘根路径
lpSectorsPerCluster Long,用于装载一个簇内扇区数的变量
lpBytesPerSector Long,用于装载一个扇区内字节数的变量
lpNumberOfFreeClusters Long,用于装载磁盘上剩余簇数的变量
lpTtoalNumberOfClusters Long,用于装载磁盘上总簇数的变量
注解
在采用FAT16格式的windows95系统中,如一个驱动器(分区)的容量超过了2GB,则不应使用这个函数。此时,这个函数能识别的最大分区容量只有2GB

回复
发动态
发帖子
VB基础类
创建于2007-09-28

7453

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告