1. 程式人生 > >VBA操作檔案四大方法之之四-API函式

VBA操作檔案四大方法之之四-API函式

3、GetDiskFreeSpaceEx
    作用:獲取與一個磁碟的組織以及剩餘空間容量有關的資訊
    宣告: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.
    在採用FAT16格式的windows95系統中,如一個驅動器(分割槽)的容量超過了2GB,則不應使用這個函式。此時,這個函式能識別的最大分割槽容量只有2GB
    引數說明:
    lpRootPathName String,不包括卷名的磁碟根路徑名
    lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一個變數,用於容納呼叫者可用的位元組數量
    lpTotalNumberOfBytes LARGE_INTEGER,指定一個變數,用於容納磁碟上的總位元組數
    lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一個變數,用於容納磁碟上可用的位元組數
    LARGE_INTEGER結構用來代表一個64位帶符號的整數值,它的定義如下:
    Type LARGE_INTEGER ' 8 Bytes
        lowpart As Long
        highpart As Long
    End Type
    其中lowpart為 Long,指定低32位,highpart 為 Long,指定高32位。
    示例:雖然此函式能識別的最大分割槽容量只有2GB,但通過調整,對大於2G的仍然能得出正確容量。以下的調整公式是本人通過逆向推算出來的,至於其中的原理也不是很清楚,大家可一測試一下。
    Private Sub Get_DiskFreeSpaceEx()
        Dim temp As Long, Dms$
        Dim tempa, tempb, tempc
        Dim RootPathName As String
        Dim FreeBytesAvailabletoCaller As LARGE_INTEGER
        Dim TotalNumberOfBytes As LARGE_INTEGER
        Dim TotalNumberOfFreeBytes As LARGE_INTEGER
        RootPathName = "d:"
        '取得磁碟空間
        temp = GetDiskFreeSpaceEx(RootPathName, FreeBytesAvailabletoCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes)
        Dms = Dms + "磁碟容量:" + vbCrLf
        tempa = TotalNumberOfBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfBytes.lowpart > 0,  _
                  TotalNumberOfBytes.lowpart,     TotalNumberOfBytes.lowpart + 2 ^ 32) '計算容量
        Dms = Dms + CStr(tempa) + "位元組" + vbCrLf
        tempa = Format(tempa / 1024 / 1024 / 1024, "0.00")
        Dms = Dms + tempa + "G" + vbCrLf
        '取得磁碟可用空間
        Dms = Dms + "磁碟可用空間:" + vbCrLf
        tempb = TotalNumberOfFreeBytes.highpart * 2 ^ 32 + IIf(TotalNumberOfFreeBytes.lowpart > 0, TotalNumberOfFreeBytes.lowpart, TotalNumberOfFreeBytes.lowpart + 2 ^ 32) '計算
        Dms = Dms + CStr(tempb) + "位元組" + vbCrLf
        tempb = Format(tempb / 1024 / 1024 / 1024, "0.00")
        Dms = Dms + tempb + "G" + vbCrLf
        '取得磁碟已用空間
        Dms = Dms + "磁碟已用空間:" + vbCrLf
        tempc = tempa - tempb
        Dms = Dms + CStr(tempc) + "G" + vbCrLf
        MsgBox Dms
    End Sub