四、利用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