vb 二进制文件读写

vb 二进制文件读写,第1张

二进制文件的 *** 作

所有文件的存储其实质都是二进制的,二进制文件往往由两部分组成,一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息,以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罢了。

Sub writeBinary(bstr, path)

Dim fso

Dim ts

Set fso = CreateObject("Scripting.FileSystemObject")

On Error Resume Next

Set ts = fso.createTextFile(path)

If Err.number <>0 Then

MsgBox(Err.message)

Exit Sub

End If

On Error GoTo 0

ts.Write(bstr)

ts.Close

End Sub

下面的示例代码是逐字节读取一个二进制文件(1.dat),与一个固定数值(比如&H72)进行异或(Xor)后再逐字节写入另一个文件(2.dat)。这其实就是一个简单的文件加密的过程。

Private Sub Form_Click() '点击窗体运行

Dim b As Byte

Open "d:\tmp\1.dat" For Binary As #1

Open "d:\tmp\2.dat" For Binary As #2

Do

Get #1, , b

If Not EOF(1) Then Put #2, , b Xor &H72

Loop Until EOF(1)

Close

MsgBox "运行完毕"

End Sub

解密过程也很简单,只要把代码中的两个文件名互相对换,其他代码不变,即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11509809.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存