四、利用API函數(shù)來(lái)處理文件
通過(guò)前面三種方法的介紹,你是否已經(jīng)覺(jué)得足夠了?是的,前面的方法完全可以應(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
GetCurrentDirectory
GetDiskFreeSpace,GetDiskFreeSpaceEx
GetDriveType
GetFullPathName
GetLogicalDrives
GetLogicalDriveStrings
GetSystemDirectory
GetTempPath
GetVolumeInformation
GetWindowsDirectory
RemoveDirectory
SetCurrentDirectory
SetVolumeLabel
下面通過(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èi)型為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)器;以次類(lèi)推
示例:
Public Sub Get_LogicalDrives()
Dim LDs As Long, Cnt As Long, sDrives As String
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è)磁盤(pán)驅(qū)動(dòng)器的類(lèi)型
聲明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
說(shuō)明:此函數(shù)的返回值類(lèi)型為L(zhǎng)ong,如驅(qū)動(dòng)器不能識(shí)別,則返回零。如指定的目錄不存在,則返回1。如執(zhí)行成功,則用下述任何一個(gè)常數(shù)指定驅(qū)動(dòng)器類(lèi)型:DRIVE_REMOVABLE(表示磁盤(pán)可以從驅(qū)動(dòng)器上移走,通常是軟驅(qū)), DRIVE_FIXED(磁盤(pán)不能從驅(qū)動(dòng)器上移走,通常為本地硬盤(pán)), 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類(lèi)型,包含了驅(qū)動(dòng)器根目錄路徑的一個(gè)字串
此函數(shù)的功能與FSO的Drive對(duì)象的DriveType屬性是一樣的。
示例:
'定義常數(shù)變量
Private Const DRIVE_CDROM = 5
Private Const DRIVE_FIXED = 3
Private Const DRIVE_RAMDISK = 6
Private Const DRIVE_REMOTE = 4
Private Const DRIVE_REMOVABLE = 2
Private Sub Get_DriveType()
End Sub
3、GetDiskFreeSpaceEx
作用:獲取與一個(gè)磁盤(pán)的組織以及剩余空間容量有關(guān)的信息
聲明:Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpRootPathName As String, lpFreeBytesAvailableToCa
說(shuō)明:此函數(shù)的返回值類(lèi)型為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,不包括卷名的磁盤(pán)根路徑名
lpFreeBytesAvailableToCa
lpTotalNumberOfBytes LARGE_INTEGER,指定一個(gè)變量,用于容納磁盤(pán)上的總字節(jié)數(shù)
lpTotalNumberOfFreeBytes
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()
'取得磁盤(pán)空間
'取得磁盤(pán)可用空間
'取得磁盤(pán)已用空間
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èi)型為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()
End Sub
5、RemoveDirectory
作用:移除一個(gè)目錄
聲明:Declare Function RemoveDirectory Lib "kernel32" Alias "RemoveDirectoryA" (ByVal lpPathName As String) As Long
說(shuō)明:此函數(shù)的返回值類(lèi)型為L(zhǎng)ong,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError.
在調(diào)用這個(gè)函數(shù)前,目錄必須為空
參數(shù)說(shuō)明:
lpPathName 為String類(lèi)型,要?jiǎng)h除的那個(gè)目錄的名字
示例:
Private Sub Remove_Directory()
End Sub
6、SetCurrentDirectory
作用:設(shè)置當(dāng)前目錄,與VBA語(yǔ)句ChDir類(lèi)似。
聲明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
說(shuō)明:此函數(shù)的返回值類(lèi)型為L(zhǎng)ong,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError
參數(shù)說(shuō)明:
LpPathName String,新當(dāng)前目錄的路徑
示例:
SetCurrentDirectory "d:\"
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)行寫(xiě)操作
聲明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
說(shuō)明:此函數(shù)的返回值類(lèi)型為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)度
聯(lián)系客服