四、利用API函數(shù)來(lái)處理文件
通過(guò)前面三種方法的介紹,,你是否已經(jīng)覺得足夠了,?是的,前面的方法完全可以應(yīng)付幾乎所有的文件操作。但是為了普及一下API,展示一下API的魅力,最后向大家介紹一下如何利用API函數(shù)來(lái)處理文件,。另一方面也是本人對(duì)API情有獨(dú)鐘,為她做一下廣告,,呵呵,。
大家對(duì)API的強(qiáng)大也是有所耳聞了,在文件操作方面,,API自然毫不遜色,。
說(shuō)明:為了文章簡(jiǎn)潔,我們先給出API函數(shù)的名稱及功能,,其完整的聲明及常數(shù)就不再一一細(xì)訴,,只在示例中給出其完整用法。
(一)處理驅(qū)動(dòng)器及目錄
下面是windows中提供的對(duì)于目錄進(jìn)行操作的API函數(shù)及其功能:
CreateDirectory,CreateDirectoryEx 創(chuàng)建一個(gè)新目錄
GetCurrentDirectory 在一個(gè)緩沖區(qū)中裝載當(dāng)前目錄
GetDiskFreeSpace,GetDiskFreeSpaceEx 獲取與一個(gè)磁盤的組織有關(guān)的信息,,以及了解剩余空間的容量
GetDriveType 判斷一個(gè)磁盤驅(qū)動(dòng)器的類型
GetFullPathName 獲取指定文件的完整路徑名
GetLogicalDrives 判斷系統(tǒng)中存在哪些邏輯驅(qū)動(dòng)器字母
GetLogicalDriveStrings 獲取一個(gè)字串,,其中包含了當(dāng)前所有邏輯驅(qū)動(dòng)器的根驅(qū)動(dòng)器路徑
GetSystemDirectory 這個(gè)函數(shù)能取得Windows系統(tǒng)目錄(System目錄)的完整路徑名。在這個(gè)目錄中,,包含了所有必要的系統(tǒng)文件,。根據(jù)微軟的標(biāo)準(zhǔn),其他定制控件和一些共享組件也可放到這個(gè)目錄,。通常應(yīng)避免在這個(gè)目錄里創(chuàng)建文件,。在網(wǎng)絡(luò)環(huán)境中,往往需要管理員權(quán)限才可對(duì)這個(gè)目錄進(jìn)行寫操作
GetTempPath 獲取為臨時(shí)文件指定的路徑
GetVolumeInformation 獲取與一個(gè)磁盤卷有關(guān)的信息
GetWindowsDirectory 這個(gè)函數(shù)能獲取Windows目錄的完整路徑名,。在這個(gè)目錄里,,保存了大多數(shù)windows應(yīng)用程序文件及初始化文件
RemoveDirectory 刪除指定目錄
SetCurrentDirectory 設(shè)置當(dāng)前目錄
SetVolumeLabel 設(shè)置一個(gè)磁盤的卷標(biāo)(Label)
下面通過(guò)幾個(gè)例子來(lái)詳細(xì)的了解一下其中主要的幾個(gè)函數(shù)及其用法:
1、GetLogicalDrives
作用:判斷系統(tǒng)中存在哪些邏輯驅(qū)動(dòng)器字母
聲明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives" () As Long
說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,這個(gè)結(jié)構(gòu)中的二進(jìn)制位標(biāo)志著存在哪些驅(qū)動(dòng)器,。其中,位0設(shè)為1表示驅(qū)動(dòng)器A:存在于系統(tǒng)中,;位1設(shè)為1表示存在B:驅(qū)動(dòng)器;以次類推
示例:
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
上面的示例中,,我們通過(guò)二進(jìn)制運(yùn)算,,將返回值轉(zhuǎn)換成字符,。如果你的機(jī)上有C,D,E,F,G,H這幾個(gè)驅(qū)動(dòng)器,那么LDs的值就是252,,轉(zhuǎn)成二進(jìn)制為11111100,,從右往左,依次代表A,B,C,D,...,,為0的說(shuō)明沒(méi)有此驅(qū)動(dòng)器字母,。大家可以自己試一試。
2,、GetDriveType
作用:判斷一個(gè)磁盤驅(qū)動(dòng)器的類型
聲明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,如驅(qū)動(dòng)器不能識(shí)別,則返回零,。如指定的目錄不存在,,則返回1。如執(zhí)行成功,,則用下述任何一個(gè)常數(shù)指定驅(qū)動(dòng)器類型:DRIVE_REMOVABLE(表示磁盤可以從驅(qū)動(dòng)器上移走,,通常是軟驅(qū)), DRIVE_FIXED(磁盤不能從驅(qū)動(dòng)器上移走,,通常為本地硬盤),, DRIVE_REMOTE(驅(qū)動(dòng)器是遠(yuǎn)程網(wǎng)絡(luò)驅(qū)動(dòng)器), DRIVE_CDROM(驅(qū)動(dòng)器是CD-ROM驅(qū)動(dòng)器) 或 DRIVE_RAMDISK(驅(qū)動(dòng)器是RAM驅(qū)動(dòng)器)
參數(shù)為String類型,,包含了驅(qū)動(dòng)器根目錄路徑的一個(gè)字串
此函數(shù)的功能與FSO的Drive對(duì)象的DriveType屬性是一樣的,。
示例:
'定義常數(shù)變量
Private Const DRIVE_CDROM = 5 '表示光盤驅(qū)動(dòng)器
Private Const DRIVE_FIXED = 3 '表示硬盤驅(qū)動(dòng)器
Private Const DRIVE_RAMDISK = 6 '表示RAM驅(qū)動(dòng)器
Private Const DRIVE_REMOTE = 4 '表示網(wǎng)絡(luò)驅(qū)動(dòng)器
Private Const DRIVE_REMOVABLE = 2 '表示軟盤驅(qū)動(dòng)器
Private Sub Get_DriveType()
Dim temp As Long
temp = GetDriveType("d:\") '取的d:盤驅(qū)動(dòng)器類型
Select Case temp
Case DRIVE_CDROM
MsgBox "DRIVE_CDROM: 光盤驅(qū)動(dòng)器"
Case DRIVE_FIXED
MsgBox "DRIVE_FIXED: 硬盤驅(qū)動(dòng)器"
Case DRIVE_RAMDISK
MsgBox "DRIVE_RAMDISK: RAM驅(qū)動(dòng)器"
Case DRIVE_REMOTE
MsgBox "DRIVE_REMOTE: 網(wǎng)絡(luò)驅(qū)動(dòng)器"
Case DRIVE_REMOVABLE
MsgBox "DRIVE_REMOVABLE: 軟盤驅(qū)動(dòng)器"
End Select
End Sub
3、GetDiskFreeSpaceEx
作用:獲取與一個(gè)磁盤的組織以及剩余空間容量有關(guān)的信息
聲明: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
說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,非零表示成功,,零表示失敗。會(huì)設(shè)置GetLastError.
在采用FAT16格式的windows95系統(tǒng)中,,如一個(gè)驅(qū)動(dòng)器(分區(qū))的容量超過(guò)了2GB,,則不應(yīng)使用這個(gè)函數(shù)。此時(shí),,這個(gè)函數(shù)能識(shí)別的最大分區(qū)容量只有2GB
參數(shù)說(shuō)明:
lpRootPathName String,,不包括卷名的磁盤根路徑名
lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一個(gè)變量,,用于容納調(diào)用者可用的字節(jié)數(shù)量
lpTotalNumberOfBytes LARGE_INTEGER,,指定一個(gè)變量,用于容納磁盤上的總字節(jié)數(shù)
lpTotalNumberOfFreeBytes LARGE_INTEGER,,指定一個(gè)變量,,用于容納磁盤上可用的字節(jié)數(shù)
LARGE_INTEGER結(jié)構(gòu)用來(lái)代表一個(gè)64位帶符號(hào)的整數(shù)值,它的定義如下:
Type LARGE_INTEGER ' 8 Bytes
lowpart As Long
highpart As Long
End Type
其中l(wèi)owpart為 Long,,指定低32位,highpart 為 Long,,指定高32位,。
示例:雖然此函數(shù)能識(shí)別的最大分區(qū)容量只有2GB,但通過(guò)調(diào)整,,對(duì)大于2G的仍然能得出正確容量,。以下的調(diào)整公式是本人通過(guò)逆向推算出來(lái)的,至于其中的原理也不是很清楚,,大家可一測(cè)試一下,。
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) '計(jì)算容量
Dms = Dms + CStr(tempa) + "字節(jié)" + 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) '計(jì)算
Dms = Dms + CStr(tempb) + "字節(jié)" + 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
作用:創(chuàng)建一個(gè)新目錄
聲明:
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)
說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,非零表示成功,,零表示失敗。會(huì)設(shè)置GetLastError
參數(shù)說(shuō)明:
lpTemplateDirectory String,,指定一個(gè)模板目錄的名字,,從中復(fù)制默認(rèn)屬性(比如目錄中文件的默認(rèn)壓縮方式)。如設(shè)為vbNullString,,則表示不使用模板
lpNewDirectory String,,新目錄的名字
lpSecurityAttributes SECURITY_ATTRIBUTES,這個(gè)結(jié)構(gòu)定義了目錄的安全特性——如果操作系統(tǒng)支持的話
示例:
Private Sub Create_Directory()
Dim Security As SECURITY_ATTRIBUTES
'創(chuàng)建目錄
Ret& = CreateDirectory("C:\Directory", Security)
'若返回0,,則失敗,。
If Ret& = 0 Then MsgBox "Error : 創(chuàng)建失敗!", vbCritical + vbOKOnly
End Sub
5、RemoveDirectory
作用:移除一個(gè)目錄
聲明:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long
說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,非零表示成功,,零表示失敗。會(huì)設(shè)置GetLastError.
在調(diào)用這個(gè)函數(shù)前,,目錄必須為空
參數(shù)說(shuō)明:
lpPathName 為String類型,,要?jiǎng)h除的那個(gè)目錄的名字
示例:
Private Sub Remove_Directory()
Dim Security As SECURITY_ATTRIBUTES
CreateDirectoryEx "C:\Windows", "C:\Temp", Security
'移除目錄
RemoveDirectory "C:\Temp"
End Sub
6、SetCurrentDirectory
作用:設(shè)置當(dāng)前目錄,,與VBA語(yǔ)句ChDir類似,。
聲明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,非零表示成功,,零表示失敗,。會(huì)設(shè)置GetLastError
參數(shù)說(shuō)明:
LpPathName String,新當(dāng)前目錄的路徑
示例:
SetCurrentDirectory "d:\" '設(shè)置D:為當(dāng)前目錄
7,、GetSystemDirectory
作用:這個(gè)函數(shù)能取得Windows系統(tǒng)目錄(System目錄)的完整路徑名,。在這個(gè)目錄中,包含了所有必要的系統(tǒng)文件,。根據(jù)微軟的標(biāo)準(zhǔn),,其他定制控件和一些共享組件也可放到這個(gè)目錄。通常應(yīng)避免在這個(gè)目錄里創(chuàng)建文件,。在網(wǎng)絡(luò)環(huán)境中,,往往需要管理員權(quán)限才可對(duì)這個(gè)目錄進(jìn)行寫操作
聲明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
說(shuō)明:此函數(shù)的返回值類型為L(zhǎng)ong,,裝載到lpBuffer緩沖區(qū)的字符數(shù)量。如lpBuffer不夠大,,不能容下文件名,則返回要求的緩沖區(qū)長(zhǎng)度
參數(shù)說(shuō)明:
lpBuffer String,,用于裝載系統(tǒng)目錄路徑名的一個(gè)字串緩沖區(qū),。它應(yīng)事先初始化成nSize+1個(gè)字符的長(zhǎng)度。通常至少要為這個(gè)緩沖區(qū)分配MAX_PATH個(gè)字符的長(zhǎng)度
nSize Long,,lpBuffer字串的最大長(zhǎng)度
示例:
Private Sub Get_SystemDirectory()
Dim sSave As String, Ret As Long
'創(chuàng)建緩沖區(qū)
sSave = Space(255)
'獲取系統(tǒng)目錄
Ret = GetSystemDirectory(sSave, 255)
'移除多余的0
sSave = Left$(sSave, Ret)
'顯示路徑
MsgBox "系統(tǒng)目錄: " + sSave
End Sub