Excel-VBA操作檔案四大方法之四(1)

來源:互聯網
上載者:User

四、利用API函數來處理檔案

通過前面三種方法的介紹,你是否已經覺得足夠了?是的,前面的方法完全可以應付幾乎所有的檔案操作。但是為了普及一下API,展示一下API的魅力,最後向大家介紹一下如何利用API函數來處理檔案。另一方面也是本人對API情有獨鐘,為她做一下廣告,呵呵。

大家對API的強大也是有所耳聞了,在檔案操作方面,API自然毫不遜色。
說明:為了文章簡潔,我們先給出API函數的名稱及功能,其完整的聲明及常數就不再一一細訴,只在樣本中給出其完整用法。

(一)處理磁碟機及目錄

下面是windows中提供的對於目錄進行操作的API函數及其功能:

CreateDirectory,CreateDirectoryEx  建立一個新目錄
GetCurrentDirectory    在一個緩衝區中裝載目前的目錄
GetDiskFreeSpace,GetDiskFreeSpaceEx  擷取與一個磁碟的組織有關的資訊,以及瞭解剩餘空間的容量
GetDriveType   判斷一個磁碟機的類型
GetFullPathName  擷取指定檔案的完整路徑名
GetLogicalDrives  判斷系統中存在哪些邏輯磁碟機字母
GetLogicalDriveStrings  擷取一個字串,其中包含了當前所有邏輯磁碟機的根磁碟機路徑
GetSystemDirectory  這個函數能取得Windows系統目錄(System目錄)的完整路徑名。在這個目錄中,包含了所有必要的系統檔案。根據微軟的標準,其他定製控制項和一些共用組件也可放到這個目錄。通常應避免在這個目錄裡建立檔案。在網路環境中,往往需要管理員權限才可對這個目錄進行寫操作 
GetTempPath   擷取為臨時檔案指定的路徑
GetVolumeInformation  擷取與一個磁碟卷有關的資訊
GetWindowsDirectory  這個函數能擷取Windows目錄的完整路徑名。在這個目錄裡,儲存了大多數windows應用程式檔案及初始設定檔案
RemoveDirectory  刪除指定目錄
SetCurrentDirectory  設定目前的目錄
SetVolumeLabel   設定一個磁碟的卷標(Label)

下面通過幾個例子來詳細的瞭解一下其中主要的幾個函數及其用法:

1、GetLogicalDrives

作用:判斷系統中存在哪些邏輯磁碟機字母

聲明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives" () As Long

說明:此函數的傳回值類型為Long,這個結構中的二進位位標誌著存在哪些磁碟機。其中,位0設為1表示磁碟機A:存在於系統中;位1設為1表示存在B:磁碟機;以次類推

樣本:
Public Sub Get_LogicalDrives()
Dim LDs As Long, Cnt As Long, sDrives As String
    LDs = GetLogicalDrives
    sDrives = "Available drives:"
    For Cnt = 0 To 25
        If (LDs And 2 ^ Cnt) <> 0 Then
            sDrives = sDrives + "  " + Chr$(65 + Cnt)
        End If
    Next Cnt
MsgBox sDrives
End Sub

上面的樣本中,我們通過二進位運算,將傳回值轉換成字元。如果你的機上有C,D,E,F,G,H這幾個磁碟機,那麼LDs的值就是252,轉成二進位為11111100,從右往左,依次代表A,B,C,D,...,為0的說明沒有此磁碟機字母。大家可以自己試一試。

2、GetDriveType

作用:判斷一個磁碟機的類型

聲明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

說明:此函數的傳回值類型為Long,如磁碟機不能識別,則返回零。如指定的目錄不存在,則返回1。如執行成功,則用下述任何一個常數指定磁碟機類型:DRIVE_REMOVABLE(表示磁碟可以從磁碟機上移走,通常是軟碟機), DRIVE_FIXED(磁碟不能從磁碟機上移走,通常為本地硬碟), DRIVE_REMOTE(磁碟機是遠程網路磁碟機), DRIVE_CDROM(磁碟機是CD-ROM磁碟機) 或 DRIVE_RAMDISK(磁碟機是RAM磁碟機)
參數為String類型,包含了磁碟機根目錄路徑的一個字串
此函數的功能與FSO的Drive對象的DriveType屬性是一樣的。

樣本:
'定義常數變數

Private Const DRIVE_CDROM = 5       '表示光碟片磁碟機
Private Const DRIVE_FIXED = 3       '表示硬碟
Private Const DRIVE_RAMDISK = 6     '表示RAM磁碟機
Private Const DRIVE_REMOTE = 4      '表示網路磁碟機
Private Const DRIVE_REMOVABLE = 2   '表示軟碟機

Private Sub Get_DriveType()
  Dim temp As Long
  temp = GetDriveType("d:/")    '取的d:盤磁碟機類型
  Select Case temp
    Case DRIVE_CDROM
      MsgBox "DRIVE_CDROM: 光碟片磁碟機"
    Case DRIVE_FIXED
      MsgBox "DRIVE_FIXED: 硬碟"
    Case DRIVE_RAMDISK
      MsgBox "DRIVE_RAMDISK: RAM磁碟機"
    Case DRIVE_REMOTE
      MsgBox "DRIVE_REMOTE: 網路磁碟機"
    Case DRIVE_REMOVABLE
      MsgBox "DRIVE_REMOVABLE: 軟碟機"
  End Select
End Sub

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

4、CreateDirectory, CreateDirectoryEx

作用:建立一個新目錄

聲明:
Declare Function CreateDirectory& Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES)

Declare Function CreateDirectoryEx& Lib "kernel32" Alias "CreateDirectoryExA" (ByVal lpTemplateDirectory As String, ByVal lpNewDirectory As String, lpSecurityAttributes As SECURITY_ATTRIBUTES)

說明:此函數的傳回值類型為Long,非零表示成功,零表示失敗。會設定GetLastError

參數說明:
lpTemplateDirectory String,指定一個模板目錄的名字,從中複製預設屬性(比如目錄中檔案的預設壓縮方式)。如設為vbNullString,則表示不使用模板
lpNewDirectory String,新目錄的名字
lpSecurityAttributes SECURITY_ATTRIBUTES,這個結構定義了目錄的安全特性——如果作業系統支援的話

樣本:
Private Sub Create_Directory()
    Dim Security As SECURITY_ATTRIBUTES
    '建立目錄
    Ret& = CreateDirectory("C:/Directory", Security)
    '若返回0,則失敗。
    If Ret& = 0 Then MsgBox "Error : 建立失敗!", vbCritical + vbOKOnly
End Sub

5、RemoveDirectory

作用:移除一個目錄

聲明:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long

說明:此函數的傳回值類型為Long,非零表示成功,零表示失敗。會設定GetLastError.
在調用這個函數前,目錄必須為空白

參數說明:
lpPathName 為String類型,要刪除的那個目錄的名字

樣本:
Private Sub Remove_Directory()
    Dim Security As SECURITY_ATTRIBUTES
    CreateDirectoryEx "C:/Windows", "C:/Temp", Security
    '移除目錄
    RemoveDirectory "C:/Temp"
End Sub

6、SetCurrentDirectory

作用:設定目前的目錄,與VBA語句ChDir類似。

聲明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long

說明:此函數的傳回值類型為Long,非零表示成功,零表示失敗。會設定GetLastError

參數說明:
LpPathName String,新目前的目錄的路徑

樣本:
SetCurrentDirectory "d:/"  '設定D:為目前的目錄

7、GetSystemDirectory

作用:這個函數能取得Windows系統目錄(System目錄)的完整路徑名。在這個目錄中,包含了所有必要的系統檔案。根據微軟的標準,其他定製控制項和一些共用組件也可放到這個目錄。通常應避免在這個目錄裡建立檔案。在網路環境中,往往需要管理員權限才可對這個目錄進行寫操作

聲明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

說明:此函數的傳回值類型為Long,裝載到lpBuffer緩衝區的字元數量。如lpBuffer不夠大,不能容下檔案名稱,則返回要求的緩衝區長度

參數說明:
lpBuffer String,用於裝載系統目錄路徑名的一個字串緩衝區。它應事先初始化成nSize+1個字元的長度。通常至少要為這個緩衝區分配MAX_PATH個字元的長度
nSize Long,lpBuffer字串的最大長度

樣本:
Private Sub Get_SystemDirectory()
    Dim sSave As String, Ret As Long
    '建立緩衝區
    sSave = Space(255)
    '擷取系統目錄
    Ret = GetSystemDirectory(sSave, 255)
    '移除多餘的0
    sSave = Left$(sSave, Ret)
    '顯示路徑
    MsgBox "系統目錄: " + sSave
End Sub

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.