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

來源:互聯網
上載者:User

(二)處理檔案

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

CloseHandle   關閉一個核心對象。其中包括檔案、檔案對應、進程、線程、安全和同步對象等。
CompareFileTime  根據FILETIME結構的資訊,對比兩個檔案的時間
CopyFile   複製檔案。注意:只能複製檔案,而不能複製目錄
CreateFile   這是一個全功能的函數,可開啟和建立檔案、管道、郵槽、通訊服務、裝置以及控制台
DeleteFile   刪除指定檔案
FindClose   關閉由FindFirstFile函數建立的一個搜尋控制代碼
FindFirstFile   根據檔案名稱尋找檔案
FindNextFile   根據調用FindFirstFile函數時指定的一個檔案名稱尋找下一個檔案
FlushFileBuffers  針對指定的檔案控制代碼,重新整理內部檔案緩衝區
GetBinaryType   判斷檔案是否可以執行
GetFileAttributes  判斷指定檔案的屬性
GetFileInformationByHandle 該函數能夠擷取上面所有函數所能夠擷取的資訊,如大小、屬性等,同時還包括一些其他地方無法擷取的資訊,比如:檔案卷標、索引和連結資訊。
GetFileSize   判斷檔案長度
GetFileTime   取得指定檔案的時間資訊,有三個檔案時間:建立時間、最後訪問時間、最後寫時間。
GetFileType   在給出檔案控制代碼的前提下,判斷檔案類型
GetFileVersionInfo  從支援版本戳記的一個模組裡擷取檔案版本資訊
GetFileVersionInfoSize  針對包含了版本資源的一個檔案,判斷容納檔案版本資訊需要一個多大的緩衝區
GetFullPathName  擷取檔案路徑,該函數擷取檔案的完整路徑名。注意:只有當該檔案在目前的目錄下,
   結果才正確。如果要得到真正的路徑。應該用GetModuleFileName函數。
GetShortPathName  擷取指定檔案的短路徑名
GetTempFileName  這個函數包含了一個臨時檔案的名字,它可由應用程式使用
GetTempPath   擷取Windows臨時目錄路徑
lclose    關閉指定的檔案,請參考CloseHandle函數,瞭解進一步的情況
lcreat    建立一個檔案。如檔案已經存在,就會將其縮短成零長度,並將其開啟,以便讀寫
llseek    設定檔案中進行讀寫的當前位置。該函數與vba的seek語句類似。
LockFile   在windows中,檔案可用共用模式開啟——在這種情況下,多個進程可同時訪問該檔案。
   利用這個函數,要對檔案進行讀寫的一個應用程式可將檔案的某一部分鎖定起來,使其
   不能由其他應用程式訪問。這樣便避免了同時讀寫時發生的衝突
LockFileEx   與LockFile相似,只是它提供了更多的功能
lopen    以二進位模式開啟指定的檔案
lread    將檔案中的資料讀入記憶體緩衝區
lwrite    將資料從記憶體緩衝區寫入一個檔案
MoveFile, MoveFileEx  移動檔案。如dwFlags設為零,則MoveFile完全等價於MoveFileEx
OpenFile   這個函數能執行大量不同的檔案操作。和這個函數相比,請優先考慮CreateFile函數
   (它能開啟具名管道和控制Unicode檔案名稱,同時不受128個字元的路徑名稱的限制)
ReadFile   從檔案中讀出資料。與lread函數相比,這個函數要明顯靈活的多。該函數能夠操作
   通訊裝置、管道、通訊端以及郵槽
ReadFileEx   與ReadFile相似,只是它只能用於非同步讀操作,並包含了一個完整的回調
SearchPath   尋找指定檔案
SetEndOfFile   針對一個開啟的檔案,將當前檔案位置設為檔案末尾
SetFileAttributes  設定檔案屬性
SetFilePointer   在一個檔案中設定當前的讀寫位置
SetFileTime   設定檔案的建立、訪問及上次修改時間
UnlockFile   解除對一個檔案的鎖定
UnlockFileEx   解除對一個檔案的鎖定
WriteFile   將資料寫入一個檔案。該函數比lwrite函數要靈活的多。也可將這個函數應用於對
   通訊裝置、管道、通訊端以及郵槽的處理
WriteFileEx   與WriteFile類似,只是它只能用於非同步寫操作,並包括了一個完整的回調

檔案的壓縮和解壓縮

LZOpenFile   開啟壓縮檔以讀取
LZSeek    尋找壓縮檔中的一個位置
LZRead    讀一個壓縮檔
LZClose   關閉一個壓縮檔
LZCopy    複製壓縮檔並在處理過程中展開
GetExpandedName  從壓縮檔中返迴文件名稱。

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

1、CreateFile

作用:這是一個全功能的常式,可開啟和建立檔案、管道、郵槽、通訊服務、裝置以及控制台

聲明:
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

說明:
此函數的傳回值類型為Long,如執行成功,則返迴文件控制代碼。INVALID_HANDLE_VALUE表示出錯,會設定GetLastError。即使函數成功,但若檔案存在,且指定了CREATE_ALWAYS 或 OPEN_ALWAYS,GetLastError也會設為ERROR_ALREADY_EXISTS

開啟一個通訊連接埠時(如COM1),無論如何都要設定成 OPEN_EXISTING。

這個函數代替了lOpen 和 lCreate函數,應該是我們的首選

參數說明:

·lpFileName   String,要開啟的檔案的名字
·dwDesiredAccess  Long,如果為 GENERIC_READ 表示允許對裝置進行讀訪問;如果為 GENERIC_WRITE 表示允許對裝置進行寫訪問(可組合使用);如果為零,表示只允許擷取與一個裝置有關的資訊
·dwShareMode   Long,零表示不共用; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允許對檔案進行共用訪問
·lpSecurityAttributes  SECURITY_ATTRIBUTES,指向一個SECURITY_ATTRIBUTES結構的指標,定義了檔案的安全特性(如果作業系統支援的話)
 
·dwCreationDisposition
Long,下述常數之一:
CREATE_NEW   建立檔案;如檔案存在則會出錯
CREATE_ALWAYS   建立檔案,會改寫前一個檔案
OPEN_EXISTING   檔案必須已經存在。由裝置提出要求
OPEN_ALWAYS   如檔案不存在則建立它
TRUNCATE_EXISTING  講現有檔案縮短為零長度

·dwFlagsAndAttributes
Long,一個或多個下述常數
FILE_ATTRIBUTE_ARCHIVE   標記歸檔屬性
FILE_ATTRIBUTE_COMPRESSED  將檔案標記為已壓縮,或者標記為檔案在目錄中的預設壓縮方式
FILE_ATTRIBUTE_NORMAL   預設屬性
FILE_ATTRIBUTE_HIDDEN   隱藏檔案或目錄
FILE_ATTRIBUTE_READONLY  檔案為唯讀
FILE_ATTRIBUTE_SYSTEM   檔案為系統檔案
FILE_FLAG_WRITE_THROUGH  作業系統不得延遲對檔案的寫操作
FILE_FLAG_OVERLAPPED   允許對檔案進行重疊操作
FILE_FLAG_NO_BUFFERING   禁止對檔案進行緩衝處理。檔案只能寫入磁碟卷的扇區塊
FILE_FLAG_RANDOM_ACCESS  針對隨機訪問對檔案緩衝進行最佳化
FILE_FLAG_SEQUENTIAL_SCAN  針對連續訪問對檔案緩衝進行最佳化
FILE_FLAG_DELETE_ON_CLOSE  關閉了上一次開啟的控制代碼後,將檔案刪除。特別適合臨時檔案
也可在Windows NT下組合使用下述常數標記:
SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION, SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLY
 
·hTemplateFile  Long,如果不為零,則指定一個檔案控制代碼。新檔案將從這個檔案中複製擴充屬性

樣本如下:

lngHandle = CreateFile("c:/text.txt", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)

'上面代碼以寫方法開啟檔案,如檔案不存在則建立它。

2、lcreat

作用:建立一個檔案。如檔案已經存在,就會將其縮短成零長度,並將其開啟,以便讀寫

聲明:Declare Function lcreat Lib "kernel32" Alias "_lcreat" (ByVal lpPathName As String, ByVal iAttribute As Long) As Long

說明:此函數的傳回值類型為Long,如執行成功,返回開啟檔案的控制代碼。如果出錯,則返回HFILE_ERROR

該函數會開啟已由其他應用程式開啟的檔案,所以使用它時要小心。win32的CreateFile函數已取代了這個函數。這個函數與vb的open語句作用相同

參數說明:

lpPathName String,欲建立的檔案的名字
iAttribute Long,下述值之一:

0——檔案能夠讀寫
1——建立唯讀檔案
2——建立隱藏檔案
3——建立系統檔案
 
樣本:
下面的語句開啟c:/test.txt檔案

lcreat “c:/test.txt”,0

3、lopen

作用:以二進位模式開啟指定的檔案

聲明:Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long

說明:此函數的傳回值類型為Long,如執行成功,返回開啟檔案的控制代碼。HFILE_ERROR表示出錯。會設定GetLastError

參數說明:

lpPathName String,欲開啟檔案的名字
iReadWrite Long,訪問模式和共用模式常數的一個組合,如下所示:
1、訪問模式
READ   開啟檔案,讀取其中的內容
READ_WRITE  開啟檔案,對其進行讀寫
WRITE   開啟檔案,在其中寫入內容
2、共用模式(參考OpenFile函數的標誌常數表)
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

作用:取得指定檔案的時間資訊

聲明:Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long

說明:Long,非零表示成功,零表示失敗。會設定GetLastError

如果不需要特定的資訊,那麼lpCreationTime,lpLastAccessTime,lpLastWriteTime都可以設定為零(用ByVal As Long)。這個函數返回的檔案時間採用UTC格式

參數說明:
hFile Long,檔案的控制代碼
lpCreationTime   FILETIME,用於裝載檔案的建立時間
lpLastAccessTime  FILETIME,用於裝載檔案上一次訪問的時間(FAT檔案系統不支援這一特性)
lpLastWriteTime  FILETIME,用於裝載檔案上一次修改的時間

樣本:

Dim file As Long
Dim CreationTime As FileTime
Dim lastaccesstime As FileTime
Dim lastaccesstime As FileTime
'定義結構
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)’得到檔案相關資訊

以上代碼擷取的時間資訊是Long型的,還需要時間轉換函式進行轉換,完整的樣本見附件。

5、CopyFile

作用:複製檔案。與vb的filecopy命令相似

聲明:Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

說明:Long,非零表示成功,零表示失敗。會設定GetLastError

參數說明:

lpExistingFileName  String,源檔案名稱
lpNewFileName   String,目標檔案名
bFailIfExists   Long,如果設為TRUE(非零),那麼一旦目標檔案已經存在,則函數調用會失敗。否則目標檔案被改寫

樣本:
CopyFile "c:/test1.txt", "c:/test2.txt", 1

以上代碼將c:/test1.txt 拷貝到c:/test2.txt,完整的樣本見附件。

6、MoveFile, MoveFileEx

作用:移動檔案。如dwFlags設為零,則MoveFile完全等價於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,非零表示成功,零表示失敗。會設定GetLastError

這兩個函數通常不能將檔案從一個卷移動到另一個卷。但如設定了MOVEFILE_COPY_ALLOWED標記,MoveFileEx可以做到這一點.

參數說明:

lpExistingFileName  String,欲移動的檔案名稱
lpNewFileName   String,新檔案名稱
dwFlags   Long,一個或多個下述常數
MOVEFILE_REPLACE_EXISTING 如目標檔案存在,則將其替換
MOVEFILE_COPY_ALLOWED  如移動到一個不同的卷,則複製檔案並刪除原來的檔案
MOVEFILE_DELAY_UNTIL_REBOOT 移動操作在系統下次重新啟動時正式進行。這樣便可在Windows NT中改換系統檔案

樣本:
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" ‘移動檔案
 MoveFileEx "d:/test1.txt", "c:/test.txt", MOVEFILE_COPY_ALLOWED ‘再一次移動

以上代碼實現了檔案的移動,兩次移動後,檔案不變

7、DeleteFile

作用:刪除指定檔案

聲明:Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long

說明:Long,非零表示成功,零表示失敗。會設定GetLastError

與vba的kill語句相似,在windows 95下使用這個函數要小心——即使檔案當前正由一個應用程式開啟,該函數也會將其刪除.

參數說明:
lpFileName String,欲刪除檔案的名字

樣本:

DeleteFile "c:/test.txt"  '刪除c:/test.txt檔案

完整的樣本見附件。

8、ReadFile

作用:從檔案中讀出資料。與lread函數相比,這個函數要明顯靈活的多。該函數能夠操作通訊裝置、管道、通訊端以及郵槽

聲明: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,非零表示成功,零表示失敗。會設定GetLastError。如啟動的是一次非同步讀操作,則函數會返回零值,並將ERROR_IO_PENDING設定成GetLastError的結果。如結果不是零值,但讀入的位元組數小於nNumberOfBytesToRead參數指定的值,表明早已抵達了檔案的結尾

參數:
hFile ---- Long,檔案的控制代碼
lpBuffer ---  Any,用於儲存讀入資料的一個緩衝區
nNumberOfBytesToRead -  Long,要讀入的字元數
lpNumberOfBytesRead -  Long,從檔案中實際讀入的字元數
lpOverlapped ---  OVERLAPPED,如檔案開啟時指定了FILE_FLAG_OVERLAPPED,那麼必須用這個參數引用一個特殊的結構。那個結構定義了一次非同步讀取操作。否則,應將這個參數設為NULL(將函式宣告成ByVal As Long,並傳遞零值)

樣本:完整的樣本見附件。

9、WriteFile

作用:將資料寫入一個檔案。該函數比lwrite函數要靈活的多。也可將這個函數應用於對通訊裝置、管道、通訊端以及郵槽的處理

聲明: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(非零)表示成功,否則返回零。會設定GetLastError

參數:
hFile ---  Long,一個檔案的控制代碼
lpBuffer --- Any,要寫入的一個資料緩衝區
nNumberOfBytesToWrite -  Long,要寫入資料的位元組數量。如寫入零位元組,表示什麼都不寫入,但會更新檔案的“上一次修改時間”。針對位於遠程系統的具名管道,限制在65535個位元組以內

lpNumberOfBytesWritten -  Long,實際寫入檔案的位元組數量

lpOverlapped ---  OVERLAPPED,倘若在指定FILE_FLAG_OVERLAPPED的前提下開啟檔案,這個參數就必須引用一個特殊的結構。那個結構定義了一次非同步寫操作。否則,該參數應置為空白(將聲明變為ByVal As Long,並傳遞零值)

樣本:完整的樣本見附件。

10、SHFileOperation

作用:此函數的功能很強大,能對檔案或檔案夾進行複製、移動、重新命名、刪除的全部操作。

聲明:Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

說明:Long,TRUE(非零)表示成功,否則返回零。

參數:
lpFileOp --SHFILEOPSTRUCT類型,指定檔案的操作。
Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long       '對檔案的操作指令
        pFrom As String     '源檔案或路徑
        pTo As String       '目的檔案或路徑
        fFlags As Integer   '操作標誌
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String
End Type

樣本:見附件。

(三)總結

通過以上的介紹,我們可以看到API在檔案操作方面功能十分強大,能夠完成一些前面方法所不能完成的任務。FileSystemObject物件模型的內部可能就是用API寫的,即便不是我們也可以用API寫出一個FSO類來。API是一個巨大的寶庫,當你為實現某個功能而愁眉不展的時候,查查API可能就能找到滿意的答案。

寫的這麼多,希望對大家有所協助,至少操作檔案是沒有什麼問題了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.