文本文件的操作
此種方式是以行為單位進行讀取的基本單位,主要應用的方法和函數有Open,Close,Line Input,FreeFile,EOF等。下面先簡述其功能然後結合代碼示例進行說明。
Open:顧名思義,它的作用是打開文件,換而言之打開某個文件就是獲得某個的控制權,一般情況下當文件處於打開狀態時只有打開者才能對它進行操作。打開文件時要指定一個整數作為文件號,以後的操作都是針對這個代號進行的,而不是針對文件名。文件號也叫句柄,在程序中一個文件號只能指向一個文件,不能出現兩個文件同時具有相同句柄的情況。
Close:關閉文件,即釋放文件的控制權。
Line Input:以行為單位取得文件內容,以行為單位是指從當前位置開始到下一個換行符為止的內容。換行符是Chr(13) & Chr(10)兩個字節組成,VB中已定義了常量vbCrLf,可直接使用。要注意的是Line Input讀取一行時會把行尾的換行符去掉,因此我們在讀取每行內容時要記得補上換行符才能保持得到的內容與文件一致。
FreeFile:得到空閒的文件號,用這個函數取得文件號可以避免文件號的沖突。
例如:
Dim strFileName As String '文件名
Dim lngHandle As Long '文件句柄
Dim strAll As String '所讀取的文本文件的所有內容
Dim strLine As String '在循環中存放每行的內容
strFileName = "c:.txt"
'獲得文件的句柄
lngHandle = FreeFile()
'For後面的參數表示以何種方式打開文件,Input是讀取,Output是覆蓋寫入,Append是追加寫入
Open strFileName For Input As lngHandle
'循環直到文件尾
Do While Not EOF(lngHandle)
'每次讀取一行存放在strLine變量中
Line Input #lngHandle, strLine
'每次讀取都把所讀到的內容連接到strAll變量,由於Line Input去掉了換行符,所以這裡補上
strAll = strAll & strLine & vbCrLf
Loop
'顯示得到的全部分內容
MsgBox strAll, vbInformation
對文本文件的寫入相對簡單些,有三個步驟:打開文件,寫入文本,關閉文件。
代碼示例:
Dim strFileName As String '文件名
Dim lngHandle As Long '句柄
Dim strWrite As String '要寫入的文本內容
strFileName = "c:w.txt"
lngHandle = FreeFile() '取得句柄
'准備要寫入的內容
strWrite = "落日樓頭,斷鴻聲裡,江南游子。把吳鉤看了,欄干拍遍,無人會、登臨意。"
Open strFileName For Output As lngHandle '打開文件
Print #lngHandle, strWrite '寫入文本
Close lngHandle '關閉文件
MsgBox "寫入完成。", vbInformation
二進制文件的操作
所有文件的存儲其實質都是二進制的,二進制文件往往由兩部分組成,一部分是文件頭另一部分存放了文件的內容。文件頭通常存放與文件格式有關的信息,以BMP等圖象文件為例,它們的文件頭中存放了是何種圖形格式、圖象大小、調色板等信息,要顯示圖象時先讀取文件頭以獲得文件的詳細信息,然後再按其格式把圖象內容顯示出來。用二進制方式可以操作任何的文件,當然至關重要的一點是要清楚了解所操作文件的文件頭結構。
VB中二進制文件操作主要應用的方法和函數有:Open,Close,Get,Put等。
Open:在For後面的打開模式要用Binary。
Close:關閉文件。
Get:在指定位置取得文件的內容,如果省略位置則從當前位置讀取。
Put:在指定位置寫入文件,如果省略位置參數就從當前位置寫。
下面結合代碼講解二進制文件的操作。
下述程序完成了將兩個文件結合成一個文件以及將這個結合後的文件再拆分成原來的兩個文件。文件頭的結構是自己定義的,非常簡單,共8個字節(也就是兩個長整型的長度),前4個字節存放第一個文件的長度,後4個字節存放第二個文件的長度。為了更直觀地表達文件的結構,現假設有兩個文件,第一個文件長度是100字節,第二個文件是200字節,那麼合並後得到的文件應該是308字節。按順序來看,文件的結構是:
4第一文件的長度
4第二文件的長度
100第一文件的二進制內容
200第二文件的二進制內容
除了文件頭的8字節長度是固定的後面的長度都會因文件的不同而變化的。
‘實現文件的合並
Private Sub MergeFile()
Dim strFileName1 As String '第一個文件
Dim strFileName2 As String '第二個文件
Dim strOutput As String '合並後的文件
Dim aryContent() As Byte '用來讀取文件的數組,每次讀取前要重定義
strFileName1 = "c:a.bmp"
strFileName2 = "c:.bmp"
strOutput = "c:out.bmp"
'注意下面三個Open語句都是用Binary模式打開的
Open strOutput For Binary As #100
Open strFileName1 For Binary As #1
Open strFileName2 For Binary As #2
Put #100, , LOF(1) '取得第一文件的長度,並把它寫入到合並文件的文件頭中
Put #100, , LOF(2) '取得第二文件的長度,並寫入到合並文件的文件頭中
ReDim aryContent(LOF(1) - 1) '重定義數組,為讀取文件做准備
Get #1, , aryContent() '取得第一文件的內容到數組
Put #100, , aryContent() '把第一文件的內容寫到合並文件中
ReDim aryContent(LOF(2) - 1)
Get #2, , aryContent()
Put #100, , aryContent()
'關閉文件
Close #1
Close #2
Close #100
End Sub
‘實現文件的拆分
Private Sub SplitFile()
Dim strFileName1 As String
Dim strFileName2 As String
Dim strFileSplit As String
Dim aryContent() As Byte
Dim lngLOF(1) As Long '存放從文件頭取得的兩個文件的長度
strFileName1 = "c:a2.bmp"
strFileName2 = "c:2.bmp"
strFileSplit = "c:out.bmp"
Open strFileSplit For Binary As #100
Get #100, , lngLOF(0) '取得第一文件的長度
Get #100, , lngLOF(1) '第二文件的長度
Open strFileName1 For Binary As #1
Open strFileName2 For Binary As #2
ReDim aryContent(lngLOF(0)-1) '用第一文件的長度重定義數組,為讀取第一文件做准備
Get #100, 9, aryContent() '從第9字節,即文件後面開始讀取第一文件的內容
Put #1, , aryContent() '把取得的內容寫入到拆分文件中
ReDim aryContent(lngLOF(1)-1)
Get #100, 9 + lngLOF(0) + 1, aryContent() '從第9字節再加上第一文件的長度處開始讀取第二文件的內容,這裡可以清楚地看到文件頭的作用了
Put #2, , aryContent
Close #1
Close #2
Close #100
MsgBox "拆分完成。", vbInformation
文本文件由於沒有格式所以它的讀寫都比較簡單和直觀,而用二進制操作文件時其實質就是對文件頭的理解,如果不知道文件頭的結構那就無法對文件進行處理了,知道了文件頭所包含的信息後,對文件的操作其實就是按規則進行Get、Put罷了。