
1.4 使用ADODB.Stream实现文件读写
对于UTF-8编码的含中文的文本文件,无论是以传统方式,还是用FSO的TextStream对象打开,读取到的内容会出现乱码。
本书源文件“utf-8File.txt”文件中也是一首二十四节气歌,但是该文件的编码格式是UTF-8,如图1-52所示。

图1-52 UTF-8编码的文本文件
使用前面讲过的FSO方式读取该文件,读取到的是乱码,如图1-53所示。

图1-53 不期望的读取结果
下面讲述一种能够按照指定编码打开文件的方式:ADODB.Stream对象。
1.4.1 对象的引入
ADODB是一个非常重要的对象,经常用于数据库操作,在后面的章节会探讨ADODB操作数据库方面的知识,本节介绍一下ADODB.Stream读写文件。
前期绑定:工程中添加引用“Microsoft ActiveX Data Objects 2.8”,如图1-54所示。

图1-54 添加外部引用
代码中声明:Dim AStream As New ADODB.Stream,会看到自动成员提示,说明绑定成功,如图1-55所示。

图1-55 使用ADODB.Stream
后期绑定:在工程中不添加ADODB的前提下,使用CreateObject("ADODB.Stream")创建一个新的Stream对象。
1.4.2 读取文本文件
ADODB.Stream对象通过LoadFromFile方法载入文本文件,然后用ReadText方法读取所有内容。
如果ReadText后面不带参数,则相当于FSO中的ReadAll,读取全部内容,如果是ReadText i,则表示读取i个字符。
但是在装载文件之前,必须预设ADODB.Stream对象的若干属性。
Type属性:读写文本文件用adTypeText(2),读写二进制文件用adTypeBinary(1)。
Mode属性:使用adModeReadWrite(3),可读写。
CharSet属性:指定文件编码,要根据文本文件的编码来设定。
以下过程读取UTF-8格式的二十四节气歌的前四个字符。

上述过程的打印结果是:“春雨惊春”。如果把ReadText(4)改成ReadText,则读取出所有内容。
对应的后期绑定代码如下所示。

需要注意的是,由于代码中采用了后期绑定方式,并未在工程中添加ADODB引用,因此Type、Mode等属性不能用枚举常量,只能使用枚举常量的等价值。
1.4.3 写入文本文件
使用ADODB.Stream写入文本文件的步骤是:创建对象→设定属性→打开对象→写入内容→保存到文件→关闭对象。
下面的代码把一个字符串重复两次写入文本文件,并保存为UTF-8格式。

代码分析:枚举常量adSaveCreateOverWrite(2)表示如果目标文件已存在,则覆盖保存。
运行上述过程,再次打开记事本文件,如图1-56所示。

图1-56 保存为UTF-8文件
1.4.4 利用ADODB.Stream下载网页附件
除了文本文件以外,ADODB.Stream还可以读写二进制文件。在二进制文件代码编写方面,需要改动的地方主要有以下两个。
Type属性:需要改为adTypeBinary。
ReadText方法、WriteText方法分别更改为Read、Write。
下面讲解ADODB.Stream对象联合使用XMLHttp对象,实现网页附件下载到本地的功能。
XMLHttp对象经常用于向HTTP服务器发送请求,其前期绑定方式是向工程中添加引用“Microsoft XML v6.0”,如图1-57所示。

图1-57 添加外部引用
后期创建对象的方法是:CreateObject("Microsoft.XMLHTTP")。
XMLHttp对url完成请求后,返回的ResponseBody是一个未解码的二进制数据,因此,得到这个二进制数据后,用ADODB.Stream写入计算机中的文件即可实现附件的下载。
下面的实例从WinRAR压缩软件的官方网站下载WinRAR 5.50的安装文件。

代码分析:Content()是一个字节数组,用于存储XMLHttp返回的ResponseBody,然后用ADODB.Stream的Write方法,把Content保存为文件。
运行上述过程后,C:\temp\文件夹下多了一个Winrar550.exe文件。
以上内容的源代码文件为“实例文档05.xlsm”。