- Office VBA開發經典:中級進階卷
- 劉永富 劉行
- 1125字
- 2019-11-22 18:29:04
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”。
- Learning Cython Programming(Second Edition)
- 數據庫程序員面試筆試真題與解析
- JavaScript修煉之道
- Python Deep Learning
- C語言程序設計
- C和C++游戲趣味編程
- SQL 經典實例
- 智能搜索和推薦系統:原理、算法與應用
- 響應式Web設計:HTML5和CSS3實戰(第2版)
- C++ Application Development with Code:Blocks
- Android高級開發實戰:UI、NDK與安全
- 產品架構評估原理與方法
- React and React Native
- AngularJS Web Application Development Cookbook
- Scratch 3.0少兒游戲趣味編程