网上关于VBS读写二进制文件和二进制数据的文章很少,估计是高手们都很忙,那就由我这个菜鸟来写吧。不知道会不会被很多人复制粘贴然后还不注明出处,应该是会的。恩,我要好好学习知识产权法。
查了很多资料,很多不明真相的同学都叫嚣说用adodb.stream对象就可以实现。不错,是通过adodb.stream实现读写二进制文件的功能,问题是如何实现,你有自己测试过吗?给出的代码都是先用adodb.stream对象读取,然后又写入,这样做有什么意义,还不如直接复制。我想实现的是用adodb.stream直接写我保存在代码中的数据。我试过使用adodb.stream对象的write方法,但是每次都弹出"ADODB.Stream: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another."错误。想到Linux之父Torvalds Linus的一句话:“Talk is cheap. Show me the code.”光说有什么用,把代码给出来啊。没有代码,就不要说话。
下面是读写二进制文件的两个函数(过程),并不是我写的,我没有那么高的水平,也没有那么厚的脸皮说是我写的,而是国外一位VBS高人写的,膜拜之。ReadBinary函数从文件读取二进制数据并返回数组,WriteBinary将数组中的数据以二进制的形式写到文件中。
Function ReadBinary(FileName) Dim Buf(), I With CreateObject("ADODB.Stream") .Mode = 3: .Type = 1: .Open: .LoadFromFile FileName ReDim Buf(.Size - 1) For I = 0 To .Size - 1: Buf(I) = AscB(.Read(1)): Next .Close End With ReadBinary = Buf End Function Sub WriteBinary(FileName, Buf) Dim I, aBuf, Size, bStream Size = UBound(Buf): ReDim aBuf(Size \ 2) For I = 0 To Size - 1 Step 2 aBuf(I \ 2) = ChrW(Buf(I + 1) * 256 + Buf(I)) Next If I = Size Then aBuf(I \ 2) = ChrW(Buf(I)) aBuf=Join(aBuf, "") Set bStream = CreateObject("ADODB.Stream") bStream.Type = 1: bStream.Open With CreateObject("ADODB.Stream") .Type = 2 : .Open: .WriteText aBuf .Position = 2: .CopyTo bStream: .Close End With bStream.SaveToFile FileName, 2: bStream.Close Set bStream = Nothing End Sub
非常的强大,我写了一个示例程序,用WriteBinary过程写了一张图片,感兴趣的可以下载来测试一下。
[download id=13]