1.文本文件的操作
?
此種方式是以行為單位進行讀取的基本單位,主要應用的方法和函數有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:\b.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
常用到的一個函數,用來寫日志用:
Sub
?setLog(str?
As
?
String
)
'
---------
'
寫日志
'
---------
Open?App.Path?
&
?
"
\log\
"
?
&
?
CStr
(
Date
)?
&
?
"
_log.txt
"
?
For
?Append?
As
?#
1
Write?#
1
,?str
Close?#
1
End?Sub
二進制文件的操作
?
??? 所有文件的存儲其實質都是二進制的,二進制文件往往由兩部分組成,一部分是文件頭另一部分存放了文件的內容。文件頭通常存放與文件格式有關的信息,以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:\b.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:\b2.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罷了。