VB中文件操作的兩種方式
1.文本文件的操作
?
???? 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
常用到的一個函數,用來寫日志用:
' ---------
' 寫日志
' ---------
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字節長度是固定的后面的長度都會因文件的不同而變化的。
‘實現文件的合并
?
???? 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
???? 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
posted on 2006-07-15 13:35 freebird 閱讀(355) 評論(0) 編輯 收藏 所屬分類: vb