| Option Explicit Private Type LARGE_INTEGER lowpart As Long highpart As Long End Type Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long Private 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 Private Sub Command1_Click() Dim lngSectors& Dim lngTotalCluster& Dim lngFreeCluster& Dim lngPerCluster& Dim lngperBytes& Dim lngSize# GetDiskFreeSpace "c:\", lngPerCluster, lngperBytes, lngFreeCluster, lngTotalCluster MsgBox CStr(lngTotalCluster * lngperBytes * lngPerCluster) Debug.Print lngTotalCluster, lngperBytes, lngPerCluster End Sub Private Type LARGE_INTEGER lowpart As Long highpart As Long End Type Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long Private 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 Private Sub Command1_Click() '用GetDiskFreeSpace得到错误的容量 Dim lngSectors& Dim lngTotalCluster& Dim lngFreeCluster& Dim lngPerCluster& Dim lngperBytes& Dim lngSize# GetDiskFreeSpace "c:\", lngPerCluster, lngperBytes, lngFreeCluster, lngTotalCluster MsgBox CStr(lngTotalCluster * lngperBytes * lngPerCluster) End Sub 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 |