Microsoft Excel是Microsoft為使用Windows和Apple Macintosh操作系統(tǒng)的電腦編寫的一款電子表格軟件。直觀的界面、出色的計(jì)算功能和圖表工具,再加上成功的市場營銷,使Excel成為最流行的個(gè)人計(jì)算機(jī)數(shù)據(jù)處理軟件。 為了普及一下API,展示一下API的魅力,最后向大家介紹一下如何利用API函數(shù)來處理文件。另一方面也是本人對API情有獨(dú)鐘,為她做一下廣告,呵呵。 大家對API的強(qiáng)大也是有所耳聞了,在文件操作方面,API自然毫不遜色。 說明:為了文章簡潔,我們先給出API函數(shù)的名稱及功能,其完整的聲明及常數(shù)就不再一一細(xì)訴,只在示例中給出其完整用法。 ?  ?(一)處理驅(qū)動(dòng)器及目錄 下面是windows中提供的對于目錄進(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)限才可對這個(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) 下面通過幾個(gè)例子來詳細(xì)的了解一下其中主要的幾個(gè)函數(shù)及其用法: 1、GetLogicalDrives 作用:判斷系統(tǒng)中存在哪些邏輯驅(qū)動(dòng)器字母 聲明:Declare Function GetLogicalDrives Lib "kernel32" Alias "GetLogicalDrives" () As Long 說明:此函數(shù)的返回值類型為Long,這個(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
上面的示例中,我們通過二進(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的說明沒有此驅(qū)動(dòng)器字母。大家可以自己試一試。 2、GetDriveType 作用:判斷一個(gè)磁盤驅(qū)動(dòng)器的類型 聲明:Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long 說明:此函數(shù)的返回值類型為Long,如驅(qū)動(dòng)器不能識別,則返回零。如指定的目錄不存在,則返回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對象的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 說明:此函數(shù)的返回值類型為Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError. 在采用FAT16格式的windows95系統(tǒng)中,如一個(gè)驅(qū)動(dòng)器(分區(qū))的容量超過了2GB,則不應(yīng)使用這個(gè)函數(shù)。此時(shí),這個(gè)函數(shù)能識別的最大分區(qū)容量只有2GB 參數(shù)說明: 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)用來代表一個(gè)64位帶符號的整數(shù)值,它的定義如下: Type LARGE_INTEGER ' 8 Bytes lowpart As Long highpart As Long End Type
其中l(wèi)owpart為 Long,指定低 32 位 ,highpart 為 Long,指定高 32 位。 示例:雖然此函數(shù)能識別的最大分區(qū)容量只有2GB,但通過調(diào)整,對大于2G的仍然能得出正確容量。以下的調(diào)整公式是本人通過逆向推算出來的,至于其中的原理也不是很清楚,大家可一測試一下。 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) 說明:此函數(shù)的返回值類型為Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError 參數(shù)說明: 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 說明:此函數(shù)的返回值類型為Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError. 在調(diào)用這個(gè)函數(shù)前,目錄必須為空 參數(shù)說明: 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語句ChDir類似。 聲明:Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long 說明:此函數(shù)的返回值類型為Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError 參數(shù)說明: 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)限才可對這個(gè)目錄進(jìn)行寫操作 聲明:Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long 說明:此函數(shù)的返回值類型為Long,裝載到lpBuffer緩沖區(qū)的字符數(shù)量。如lpBuffer不夠大,不能容下文件名,則返回要求的緩沖區(qū)長度 參數(shù)說明: lpBuffer String,用于裝載系統(tǒng)目錄路徑名的一個(gè)字串緩沖區(qū)。它應(yīng)事先初始化成nSize+1個(gè)字符的長度。 通常至少要為這個(gè)緩沖區(qū)分配MAX_PATH個(gè)字符的長度 nSize Long,lpBuffer字串的最大長度 示例: 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
(二)處理文件 下面是windows中提供的對于文件進(jìn)行操作的API函數(shù)及其功能: CloseHandle 關(guān)閉一個(gè)內(nèi)核對象。其中包括文件、文件映射、進(jìn)程、線程、安全和同步對象等。 CompareFileTime 根據(jù)FILETIME結(jié)構(gòu)的信息,對比兩個(gè)文件的時(shí)間 CopyFile 復(fù)制文件。注意:只能復(fù)制文件,而不能復(fù)制目錄 CreateFile 這是一個(gè)全功能的函數(shù),可打開和創(chuàng)建文件、管道、郵槽、通信服務(wù)、設(shè)備以及控制臺 DeleteFile 刪除指定文件 FindClose 關(guān)閉由FindFirstFile函數(shù)創(chuàng)建的一個(gè)搜索句柄 FindFirstFile 根據(jù)文件名查找文件 FindNextFile 根據(jù)調(diào)用FindFirstFile函數(shù)時(shí)指定的一個(gè)文件名查找下一個(gè)文件 FlushFileBuffers 針對指定的文件句柄,刷新內(nèi)部文件緩沖區(qū) GetBinaryType 判斷文件是否可以執(zhí)行 GetFileAttributes 判斷指定文件的屬性 GetFileInformationByHandle 該函數(shù)能夠獲取上面所有函數(shù)所能夠獲取的信息,如大小、屬性等, 同時(shí)還包括一些其他地方無法獲取的信息,比如:文件卷標(biāo)、索引和鏈接信息。 GetFileSize 判斷文件長度 GetFileTime 取得指定文件的時(shí)間信息,有三個(gè)文件時(shí)間:創(chuàng)建時(shí)間、最后訪問時(shí)間、最后寫時(shí)間。 GetFileType 在給出文件句柄的前提下,判斷文件類型 GetFileVersionInfo 從支持版本標(biāo)記的一個(gè)模塊里獲取文件版本信息 GetFileVersionInfoSize 針對包含了版本資源的一個(gè)文件,判斷容納文件版本信息需要一個(gè)多大的緩沖區(qū) GetFullPathName 獲取文件路徑,該函數(shù)獲取文件的完整路徑名。注意:只有當(dāng)該文件在當(dāng)前目錄下, 結(jié)果才正確。如果要得到真正的路徑。應(yīng)該用GetModuleFileName函數(shù)。 GetShortPathName 獲取指定文件的短路徑名 GetTempFileName 這個(gè)函數(shù)包含了一個(gè)臨時(shí)文件的名字,它可由應(yīng)用程序使用 GetTempPath 獲取Windows臨時(shí)目錄路徑 lclose 關(guān)閉指定的文件,請參考CloseHandle函數(shù),了解進(jìn)一步的情況 lcreat 創(chuàng)建一個(gè)文件。如文件已經(jīng)存在,就會(huì)將其縮短成零長度,并將其打開,以便讀寫 llseek 設(shè)置文件中進(jìn)行讀寫的當(dāng)前位置。該函數(shù)與vba的seek語句類似。 LockFile 在windows中,文件可用共享模式打開——在這種情況下,多個(gè)進(jìn)程可同時(shí)訪問該文件。 利用這個(gè)函數(shù),要對文件進(jìn)行讀寫的一個(gè)應(yīng)用程序可將文件的某一部分鎖定起來,使其 不能由其他應(yīng)用程序訪問。這樣便避免了同時(shí)讀寫時(shí)發(fā)生的沖突 LockFileEx 與LockFile相似,只是它提供了更多的功能 lopen 以二進(jìn)制模式打開指定的文件 lread 將文件中的數(shù)據(jù)讀入內(nèi)存緩沖區(qū) lwrite 將數(shù)據(jù)從內(nèi)存緩沖區(qū)寫入一個(gè)文件 MoveFile, MoveFileEx 移動(dòng)文件。如dwFlags設(shè)為零,則MoveFile完全等價(jià)于MoveFileEx OpenFile 這個(gè)函數(shù)能執(zhí)行大量不同的文件操作。和這個(gè)函數(shù)相比,請優(yōu)先考慮CreateFile函數(shù) (它能打開命名管道和控制Unicode文件名,同時(shí)不受128個(gè)字符的路徑名稱的限制) ReadFile 從文件中讀出數(shù)據(jù)。與lread函數(shù)相比,這個(gè)函數(shù)要明顯靈活的多。該函數(shù)能夠操作 通信設(shè)備、管道、套接字以及郵槽 ReadFileEx 與ReadFile相似,只是它只能用于異步讀操作,并包含了一個(gè)完整的回調(diào) SearchPath 查找指定文件 SetEndOfFile 針對一個(gè)打開的文件,將當(dāng)前文件位置設(shè)為文件末尾 SetFileAttributes 設(shè)置文件屬性 SetFilePointer 在一個(gè)文件中設(shè)置當(dāng)前的讀寫位置 SetFileTime 設(shè)置文件的創(chuàng)建、訪問及上次修改時(shí)間 UnlockFile 解除對一個(gè)文件的鎖定 UnlockFileEx 解除對一個(gè)文件的鎖定 WriteFile 將數(shù)據(jù)寫入一個(gè)文件。該函數(shù)比lwrite函數(shù)要靈活的多。也可將這個(gè)函數(shù)應(yīng)用于對 通信設(shè)備、管道、套接字以及郵槽的處理 WriteFileEx 與WriteFile類似,只是它只能用于異步寫操作,并包括了一個(gè)完整的回調(diào) 文件的壓縮和解壓縮 LZOpenFile 打開壓縮文件以讀取 LZSeek 查找壓縮文件中的一個(gè)位置 LZRead 讀一個(gè)壓縮文件 LZClose 關(guān)閉一個(gè)壓縮文件 LZCopy 復(fù)制壓縮文件并在處理過程中展開 GetExpandedName 從壓縮文件中返回文件名稱。 下面通過幾個(gè)例子來詳細(xì)的了解一下其中主要的幾個(gè)函數(shù)及其用法: 1、CreateFile 作用:這是一個(gè)全功能的例程,可打開和創(chuàng)建文件、管道、郵槽、通信服務(wù)、設(shè)備以及控制臺 聲明: Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long 說明: 此函數(shù)的返回值類型為Long,如執(zhí)行成功,則返回文件句柄。INVALID_HANDLE_VALUE表示出錯(cuò),會(huì)設(shè)置GetLastError。即使函數(shù)成功,但若文件存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也會(huì)設(shè)為ERROR_ALREADY_EXISTS 打開一個(gè)通信端口時(shí)(如COM1),無論如何都要設(shè)置成 OPEN_EXISTING。 這個(gè)函數(shù)代替了lOpen 和 lCreate函數(shù),應(yīng)該是我們的首選 參數(shù)說明: ·lpFileName String,要打開的文件的名字 ·dwDesiredAccess Long,如果為 GENERIC_READ 表示允許對設(shè)備進(jìn)行讀訪問;如果為 GENERIC_WRITE 表示允許對設(shè)備進(jìn)行寫訪問(可組合使用);如果為零,表示只允許獲取與一個(gè)設(shè)備有關(guān)的信息 ·dwShareMode Long,零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允許對文件進(jìn)行共享訪問 ·lpSecurityAttributes SECURITY_ATTRIBUTES,指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)的指針, 定義了文件的安全特性(如果操作系統(tǒng)支持的話)
·dwCreationDisposition Long,下述常數(shù)之一: CREATE_NEW 創(chuàng)建文件;如文件存在則會(huì)出錯(cuò) CREATE_ALWAYS 創(chuàng)建文件,會(huì)改寫前一個(gè)文件 OPEN_EXISTING 文件必須已經(jīng)存在。由設(shè)備提出要求 OPEN_ALWAYS 如文件不存在則創(chuàng)建它 TRUNCATE_EXISTING 講現(xiàn)有文件縮短為零長度 ·dwFlagsAndAttributes Long,一個(gè)或多個(gè)下述常數(shù) FILE_ATTRIBUTE_ARCHIVE 標(biāo)記歸檔屬性 FILE_ATTRIBUTE_COMPRESSED 將文件標(biāo)記為已壓縮,或者標(biāo)記為文件在目錄中的默認(rèn)壓縮方式 FILE_ATTRIBUTE_NORMAL 默認(rèn)屬性 FILE_ATTRIBUTE_HIDDEN 隱藏文件或目錄 FILE_ATTRIBUTE_READONLY 文件為只讀 FILE_ATTRIBUTE_SYSTEM 文件為系統(tǒng)文件 FILE_FLAG_WRITE_THROUGH 操作系統(tǒng)不得推遲對文件的寫操作 FILE_FLAG_OVERLAPPED 允許對文件進(jìn)行重疊操作 FILE_FLAG_NO_BUFFERING 禁止對文件進(jìn)行緩沖處理。文件只能寫入磁盤卷的扇區(qū)塊 FILE_FLAG_RANDOM_ACCESS 針對隨機(jī)訪問對文件緩沖進(jìn)行優(yōu)化 FILE_FLAG_SEQUENTIAL_SCAN 針對連續(xù)訪問對文件緩沖進(jìn)行優(yōu)化 FILE_FLAG_DELETE_ON_CLOSE 關(guān)閉了上一次打開的句柄后,將文件刪除。特別適合臨時(shí)文件 也可在Windows NT下組合使用下述常數(shù)標(biāo)記: SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
·hTemplateFile Long,如果不為零,則指定一個(gè)文件句柄。新文件將從這個(gè)文件中復(fù)制擴(kuò)展屬性 示例如下: lngHandle = CreateFile("c:\text.txt", GENERIC_WRITE, _ FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0) '上面代碼以寫方法打開文件,如文件不存在則創(chuàng)建它。
2、lcreat 作用:創(chuàng)建一個(gè)文件。如文件已經(jīng)存在,就會(huì)將其縮短成零長度,并將其打開,以便讀寫 聲明:Declare Function lcreat Lib "kernel32" Alias "_lcreat" (ByVal lpPathName As String, ByVal iAttribute As Long) As Long 說明:此函數(shù)的返回值類型為Long,如執(zhí)行成功,返回打開文件的句柄。如果出錯(cuò),則返回HFILE_ERROR 該函數(shù)會(huì)打開已由其他應(yīng)用程序打開的文件,所以使用它時(shí)要小心。win32的CreateFile函數(shù)已取代了這個(gè)函數(shù)。這個(gè)函數(shù)與vb的open語句作用相同 參數(shù)說明: lpPathName String,欲創(chuàng)建的文件的名字 iAttribute Long,下述值之一: 0——文件能夠讀寫 1——?jiǎng)?chuàng)建只讀文件 2——?jiǎng)?chuàng)建隱藏文件 3——?jiǎng)?chuàng)建系統(tǒng)文件 示例:下面的語句打開c:\test.txt文件 lcreat “c:\test.txt”,0 3、lopen 作用:以二進(jìn)制模式打開指定的文件 聲明:Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long 說明:此函數(shù)的返回值類型為Long,如執(zhí)行成功,返回打開文件的句柄。HFILE_ERROR表示出錯(cuò)。會(huì)設(shè)置GetLastError 參數(shù)說明: lpPathName String,欲打開文件的名字 iReadWrite Long,訪問模式和共享模式常數(shù)的一個(gè)組合,如下所示: 1、訪問模式 READ 打開文件,讀取其中的內(nèi)容 READ_WRITE 打開文件,對其進(jìn)行讀寫 WRITE 打開文件,在其中寫入內(nèi)容 2、共享模式(參考OpenFile函數(shù)的標(biāo)志常數(shù)表) OF_SHARE_COMPAT, OF_SHARE_DENY_NONE, OF_SHARE_DENY_READ, OF_SHARE_DENY_WRITE, OF_SHARE_EXCLUSIVE 示例: lopen “c:\test.txt”,READ 4、GetFileTime 作用:取得指定文件的時(shí)間信息 聲明:Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long 說明:Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError 如果不需要特定的信息,那么lpCreationTime,lpLastAccessTime,lpLastWriteTime都可以設(shè)置為零(用ByVal As Long)。這個(gè)函數(shù)返回的文件時(shí)間采用UTC格式 參數(shù)說明: hFile Long,文件的句柄 lpCreationTime FILETIME,用于裝載文件的創(chuàng)建時(shí)間 lpLastAccessTime FILETIME,用于裝載文件上一次訪問的時(shí)間(FAT文件系統(tǒng)不支持這一特性) lpLastWriteTime FILETIME,用于裝載文件上一次修改的時(shí)間 示例: Dim file As Long Dim CreationTime As FileTime Dim lastaccesstime As FileTime Dim lastaccesstime As FileTime'定義結(jié)構(gòu) Private Type FileTime dwLowDateTime As Long dwHighDateTime As Long End Type str1 = "c:\text.txt" file = lopen(str1, READ_WRITE) ‘打開文件 temp = GetFileTime(file, CreationTime, lastaccesstime, lastwritetime)’得到文件相關(guān)信息
以上代碼獲取的時(shí)間信息是Long型的,還需要時(shí)間轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換,完整的示例見附件。 5、CopyFile 作用:復(fù)制文件。與vb的filecopy命令相似 聲明:Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long 說明:Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError 參數(shù)說明: lpExistingFileName String,源文件名 lpNewFileName String,目標(biāo)文件名 bFailIfExists Long,如果設(shè)為TRUE(非零),那么一旦目標(biāo)文件已經(jīng)存在,則函數(shù)調(diào)用會(huì)失敗。否則目標(biāo)文件被改寫 示例: CopyFile "c:\test1.txt", "c:\test2.txt", 1
以上代碼將c:\test1.txt 拷貝到c:\test2.txt,完整的示例見附件。 6、MoveFile, MoveFileEx 作用:移動(dòng)文件。如dwFlags設(shè)為零,則MoveFile完全等價(jià)于MoveFileEx 聲明: Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) Declare Function MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) 說明:Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError 這兩個(gè)函數(shù)通常不能將文件從一個(gè)卷移動(dòng)到另一個(gè)卷。但如設(shè)置了MOVEFILE_COPY_ALLOWED標(biāo)記,MoveFileEx可以做到這一點(diǎn). 參數(shù)說明: lpExistingFileName String,欲移動(dòng)的文件名 lpNewFileName String,新文件名 dwFlags Long,一個(gè)或多個(gè)下述常數(shù) MOVEFILE_REPLACE_EXISTING 如目標(biāo)文件存在,則將其替換 MOVEFILE_COPY_ALLOWED 如移動(dòng)到一個(gè)不同的卷,則復(fù)制文件并刪除原來的文件 MOVEFILE_DELAY_UNTIL_REBOOT 移動(dòng)操作在系統(tǒng)下次重新啟動(dòng)時(shí)正式進(jìn)行。這樣便可在Windows NT中改換系統(tǒng)文件 示例: Private Const MOVEFILE_COPY_ALLOWED = &H2 Private Const MOVEFILE_DELAY_UNTIL_REBOOT = &H4 Private Const MOVEFILE_REPLACE_EXISTING = &H1 MoveFile "c:\test.txt", "d:\test1.txt" ‘移動(dòng)文件 MoveFileEx "d:\test1.txt", "c:\test.txt", MOVEFILE_COPY_ALLOWED ‘再一次移動(dòng)
以上代碼實(shí)現(xiàn)了文件的移動(dòng),兩次移動(dòng)後,文件不變 7、DeleteFile 作用:刪除指定文件 聲明:Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long 說明:Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError 與vba的kill語句相似,在windows 95下使用這個(gè)函數(shù)要小心——即使文件當(dāng)前正由一個(gè)應(yīng)用程序打開,該函數(shù)也會(huì)將其刪除. 參數(shù)說明: lpFileName String,欲刪除文件的名字 示例: DeleteFile "c:\test.txt" '刪除c:\test.txt文件 8、ReadFile 作用:從文件中讀出數(shù)據(jù)。與lread函數(shù)相比,這個(gè)函數(shù)要明顯靈活的多。該函數(shù)能夠操作通信設(shè)備、管道、套接字以及郵槽 聲明:Private Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long 說明:Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError。如啟動(dòng)的是一次異步讀操作,則函數(shù)會(huì)返回零值,并將ERROR_IO_PENDING設(shè)置成GetLastError的結(jié)果。如結(jié)果不是零值,但讀入的字節(jié)數(shù)小于nNumberOfBytesToRead參數(shù)指定的值,表明早已抵達(dá)了文件的結(jié)尾 參數(shù): hFile ---- Long,文件的句柄 lpBuffer --- Any,用于保存讀入數(shù)據(jù)的一個(gè)緩沖區(qū) nNumberOfBytesToRead - Long,要讀入的字符數(shù) lpNumberOfBytesRead - Long,從文件中實(shí)際讀入的字符數(shù) lpOverlapped --- OVERLAPPED,如文件打開時(shí)指定了FILE_FLAG_OVERLAPPED,那么必須用這個(gè)參數(shù)引用一個(gè)特殊的結(jié)構(gòu)。 那個(gè)結(jié)構(gòu)定義了一次異步讀取操作。否則,應(yīng)將這個(gè)參數(shù)設(shè)為NULL(將函數(shù)聲明成ByVal As Long,并傳遞零值) 9、WriteFile 作用:將數(shù)據(jù)寫入一個(gè)文件。該函數(shù)比lwrite函數(shù)要靈活的多。也可將這個(gè)函數(shù)應(yīng)用于對通信設(shè)備、管道、套接字以及郵槽的處理 聲明:Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long 說明:Long,TRUE(非零)表示成功,否則返回零。會(huì)設(shè)置GetLastError 參數(shù): hFile --- Long,一個(gè)文件的句柄 lpBuffer --- Any,要寫入的一個(gè)數(shù)據(jù)緩沖區(qū) nNumberOfBytesToWrite-Long,要寫入數(shù)據(jù)的字節(jié)數(shù)量。如寫入零字節(jié),表示什么都不寫入,但會(huì)更新文件的“上一次修改時(shí)間。 針對位于遠(yuǎn)程系統(tǒng)的命名管道,限制在65535個(gè)字節(jié)以內(nèi) lpNumberOfBytesWritten - Long,實(shí)際寫入文件的字節(jié)數(shù)量 lpOverlapped -OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下打開文件,這個(gè)參數(shù)就必須引用一個(gè)特殊的結(jié)構(gòu)。 那個(gè)結(jié)構(gòu)定義了一次異步寫操作。否則,該參數(shù)應(yīng)置為空(將聲明變?yōu)锽yVal As Long,并傳遞零值) 10、SHFileOperation 作用:此函數(shù)的功能很強(qiáng)大,能對文件或文件夾進(jìn)行復(fù)制、移動(dòng)、重命名、刪除的全部操作。 聲明:Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long 說明:Long,TRUE(非零)表示成功,否則返回零。 參數(shù): lpFileOp --SHFILEOPSTRUCT類型,指定文件的操作。 Type SHFILEOPSTRUCT hwnd As Long wFunc As Long '對文件的操作指令 pFrom As String '源文件或路徑 pTo As String '目的文件或路徑 fFlags As Integer '操作標(biāo)志 fAnyOperationsAborted As Long hNameMappings As Long lpszProgressTitle As String End Type
(三)小結(jié) 通過以上的介紹,我們可以看到API在文件操作方面功能十分強(qiáng)大,能夠完成一些前面方法所不能完成的任務(wù)。FileSystemObject對象模型的內(nèi)部可能就是用API寫的,即便不是我們也可以用API寫出一個(gè)FSO類來。API是一個(gè)巨大的寶庫,當(dāng)你為實(shí)現(xiàn)某個(gè)功能而愁眉不展的時(shí)候,查查API可能就能找到滿意的答案。
Excel整體界面趨于平面化,顯得清新簡潔。流暢的動(dòng)畫和平滑的過渡,帶來不同以往的使用體驗(yàn)。 |