重點(diǎn)講解VB.NET二進(jìn)制文件操作
VB.NET有很多值得學(xué)習(xí)的地方,這里我們主要介紹VB.NET二進(jìn)制文件。大家都知道所有文件的存儲(chǔ)其實(shí)質(zhì)都是二進(jìn)制的,VB.NET二進(jìn)制文件往往由兩部分組成,一部分是文件頭另一部分存放了文件的內(nèi)容。文件頭通常存放與文件格式有關(guān)的信息,以BMP等圖象文件為例,它們的文件頭中存放了是何種圖形格式、圖象大小、調(diào)色板等信息,要顯示圖象時(shí)先讀取文件頭以獲得文件的詳細(xì)信息,然后再按其格式把圖象內(nèi)容顯示出來。用二進(jìn)制方式可以操作任何的文件,當(dāng)然至關(guān)重要的一點(diǎn)是要清楚了解所操作文件的文件頭結(jié)構(gòu)。
#T#VB.NET二進(jìn)制文件操作主要應(yīng)用的方法和函數(shù)有:Open,Close,Get,Put等。
Open:在For后面的打開模式要用Binary。
Close:關(guān)閉文件。
Get:在指定位置取得文件的內(nèi)容,如果省略位置則從當(dāng)前位置讀取。
Put:在指定位置寫入文件,如果省略位置參數(shù)就從當(dāng)前位置寫。
下面結(jié)合代碼講解VB.NET二進(jìn)制文件的操作
下述程序完成了將兩個(gè)文件結(jié)合成一個(gè)文件以及將這個(gè)結(jié)合后的文件再拆分成原來的兩個(gè)文件。文件頭的結(jié)構(gòu)是自己定義的,非常簡(jiǎn)單,共8個(gè)字節(jié)(也就是兩個(gè)長(zhǎng)整型的長(zhǎng)度),前4個(gè)字節(jié)存放***個(gè)文件的長(zhǎng)度,后4個(gè)字節(jié)存放第二個(gè)文件的長(zhǎng)度。為了更直觀地表達(dá)文件的結(jié)構(gòu),現(xiàn)假設(shè)有兩個(gè)文件,***個(gè)文件長(zhǎng)度是100字節(jié),第二個(gè)文件是200字節(jié),那么合并后得到的文件應(yīng)該是308字節(jié)。按順序來看,文件的結(jié)構(gòu)是:
4***文件的長(zhǎng)度
4第二文件的長(zhǎng)度
100***文件的二進(jìn)制內(nèi)容
200第二文件的二進(jìn)制內(nèi)容
除了文件頭的8字節(jié)長(zhǎng)度是固定的后面的長(zhǎng)度都會(huì)因文件的不同而變化的。
- ‘實(shí)現(xiàn)文件的合并
- Private Sub MergeFile()
- Dim strFileName1 As String '***個(gè)文件
- Dim strFileName2 As String '第二個(gè)文件
- Dim strOutput As String '合并后的文件
- Dim aryContent() As Byte '用來讀取文件的數(shù)組,每次讀取前要重定義
- strFileName1 = "c:\a.bmp"
- strFileName2 = "c:\.bmp"
- strOutput = "c:\out.bmp"
- '注意下面三個(gè)Open語(yǔ)句都是用Binary模式打開的
- Open strOutput For Binary As #100
- Open strFileName1 For Binary As #1
- Open strFileName2 For Binary As #2
- Put #100, , LOF(1) '取得***文件的長(zhǎng)度,并把它寫入到合并文件的文件頭中
- Put #100, , LOF(2) '取得第二文件的長(zhǎng)度,并寫入到合并文件的文件頭中
- ReDim aryContent(LOF(1) - 1) '重定義數(shù)組,為讀取文件做準(zhǔn)備
- Get #1, , aryContent() '取得***文件的內(nèi)容到數(shù)組
- Put #100, , aryContent() '把***文件的內(nèi)容寫到合并文件中
- ReDim aryContent(LOF(2) - 1)
- Get #2, , aryContent()
- Put #100, , aryContent()
- '關(guān)閉文件
- Close #1
- Close #2
- Close #100
- End Sub
- ‘實(shí)現(xiàn)文件的拆分
- Private Sub SplitFile()
- Dim strFileName1 As String
- Dim strFileName2 As String
- Dim strFileSplit As String
- Dim aryContent() As Byte
- Dim lngLOF(1) As Long '存放從文件頭取得的兩個(gè)文件的長(zhǎng)度
- strFileName1 = "c:\a2.bmp"
- strFileName2 = "c:\2.bmp"
- strFileSplit = "c:\out.bmp"
- Open strFileSplit For Binary As #100
- Get #100, , lngLOF(0) '取得***文件的長(zhǎng)度
- Get #100, , lngLOF(1) '第二文件的長(zhǎng)度
- Open strFileName1 For Binary As #1
- Open strFileName2 For Binary As #2
- ReDim aryContent(lngLOF(0)-1) '用***文件的長(zhǎng)度重定義數(shù)組,為讀取***文件做準(zhǔn)備
- Get #100, 9, aryContent() '從第9字節(jié),即文件后面開始讀取***文件的內(nèi)容
- Put #1, , aryContent() '把取得的內(nèi)容寫入到拆分文件中
- ReDim aryContent(lngLOF(1)-1)
- Get #100, 9 + lngLOF(0) + 1, aryContent() '從第9字節(jié)再加上***文件的長(zhǎng)度處開始讀取第二文件的內(nèi)容,這里可以清楚地看到文件頭的作用了
- Put #2, , aryContent
- Close #1
- Close #2
- Close #100
- MsgBox "拆分完成。", vbInformation
文本文件由于沒有格式所以它的讀寫都比較簡(jiǎn)單和直觀,而用二進(jìn)制操作文件時(shí)其實(shí)質(zhì)就是對(duì)文件頭的理解,如果不知道文件頭的結(jié)構(gòu)那就無法對(duì)文件進(jìn)行處理了,知道了文件頭所包含的信息后,對(duì)文件的操作其實(shí)就是按規(guī)則進(jìn)行Get、Put罷了。