计算磁盘剩余空间时溢出,怎么解决? 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
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
计算容量超过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
要解决这个问题,您必须改用另一个 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)
在模组中声明了上面的 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 以后的版本才行!
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