對FileSystemObject一直略有耳聞,VBA愛好者常常簡稱為FSO對象。
在Scripting類庫中有三個可以直接使用NEW關鍵字實例化的類,第一個就是常用的字典,第三個是FSO。
一、FSO對象引用的方法:
前期綁定:先要引用類庫文件scrrun.dll,寫代碼的時候有智能提示。如果程序發給別人用,就要用后期綁定方式。
Dim fso As New Scripting.FileSystemObject
后期綁定:不需要引用類庫文件,但沒有智能提示。
Set fso = CreateObject("Scripting.FileSystemObject")
二、使用FSO對象的CreatTextFile方法
可以使用該方法創建一個文本文件。第5行執行后,文本文件已經創建在硬盤中。
1 Sub CreateAndWrite() 2 3 Dim fso As New Scripting.FileSystemObject 4 Dim wfsm As Scripting.TextStream 5 Set wfsm = fso.CreateTextFile("d:\test.txt", True) 6 wfsm.WriteLine (Now) 7 8 wfsm.Close 9 10 End Sub
1、CreatTextFile語法:object.CreateTextFile(filename[, overwrite[, unicode]])。
參數1:要創建的文件的全路徑,字符串。
參數2:Bool值,如果相同路徑存在同名文件,是否覆蓋。
參數3:Bool值,用什么編碼寫入文件,默認是ASCII(true),也可以是unicode
返回值是TextStream類型對象,也就是本文的另一個重點,文本流。
2、為方便使用文本流對象,我在第4行做了顯式的類型聲明wfsm。
3、使用wfsm的WriteLine方法,把字符串按行寫入文件。本例是把本機的時間寫入文件。
4、Colse方法關閉流。
三、使用OpenTextFile方法
這個方法的功能很多,可以讀、寫、追加寫入。如果目標文件不存在還可以根據需求創建文件。
語法:object.OpenTextFile(filename[, iomode[, create[, format]]])
參數1:要創建的文件的全路徑,字符串。
參數2:常數。ForReading讀取、ForWriting寫入,ForAppending在文件末尾追加寫入
參數3:Bool值,如果文件不存在,是否創建。 默認是False不創建。
參數4:以什么編碼形式打開文件
1 Sub OpenTextAndWriteRead() 2 Dim fso As New Scripting.FileSystemObject 3 Dim rfsm As Scripting.TextStream 4 Dim wfsm As Scripting.TextStream 5 Dim str As String 6 7 '創建一個流用來寫入 8 Set wfsm = fso.OpenTextFile("d:\test.txt", ForAppending) 9 n = 1 10 Do 11 wfsm.WriteLine ("第" & n & "行:" & Now) 12 n = n + 1 13 Loop Until n = 11 14 wfsm.Close 15 16 '創建一個流用來讀取 17 Set rfsm = fso.OpenTextFile("d:\test.txt", ForReading) 18 Do 19 str = rfsm.ReadLine 20 Debug.Print str 21 Loop Until rfsm.AtEndOfLine 22 23 rfsm.Close 24 25 End Sub
第8-13行,創建一個文本流追加寫入文件。第17-21行,把上面寫入的內容讀出出來。AtEndofLine判斷是否到了末尾行號
四、文本流TextStream的一些方法和屬性
本文標題雖然是FSO,但讀取和寫入文件實際使用的都是TextStream的對象
1、文本流TextStream類型不能用New創建實例。但可以像例子中使用FSO的某些方法創建,也可以使用File對象的某些方法創建(見后)。
a.不同的創建方式得到不同的流對象。
b.如果創建的是讀取的流,但使用了Write方法,在運行時就會報錯。
c.相同方式創建的同一文本文件的多個流不能共存。下面的代碼運行到第7行會報錯"權限的拒絕"。其它要注意的特性可自行測試
1 Sub Test() 2 Dim fso As New Scripting.FileSystemObject 3 Dim wfsm1 As Scripting.TextStream 4 Dim wfsm2 As Scripting.TextStream 5 6 Set wfsm1 = fso.OpenTextFile("d:\test.txt", ForAppending) 7 Set wfsm2 = fso.OpenTextFile("d:\test.txt", ForAppending) 8 9 wfsm1.Close 10 wfsm2.Close 11 End Sub
2、文本流有幾個不同的讀取和寫入方法(如上所述要注意和流的類型相匹配,否則會在運行時報錯)。
讀取:Read,ReadAll,ReadLine
寫入:Write,WriteLine,WriteBlankLines
3、文本流還有一些實用的屬性。
AtEndOfLine: 文件指針正好在行尾標記,則返回TRUE
AtEndOfStream: 文件指針在文件末尾,則返回TRUE
Line: 返回一個 TextStream 文件中的當前行號。
Column: 返回 TextStream 文件中當前字符位置的列號。
4、流在使用后不要忘了Close
五、使用File對象創建TextStream
行號3定義File類型,行號6使用Fso的GetFile方法得到File對象。WriteBlankLines(2)寫入2行空行。
1 Sub FileAndTextStream() 2 Dim fso As New Scripting.FileSystemObject 3 Dim fe As Scripting.file 5 6 Set fe = fso.GetFile("d:\test.txt") 7 8 fe.OpenAsTextStream(ForWriting).WriteLine ("今天天氣好晴朗") 9 fe.OpenAsTextStream(ForAppending).WriteBlankLines (2) 10 fe.OpenAsTextStream(ForAppending).WriteLine ("處處好風光") 11 Debug.Print fe.OpenAsTextStream(ForReading).ReadAll 12 13 End Sub
六、其他
使用File對象還可以做更多其他事情,比如獲取文件名、文件的創建時間等。
FSO也還有許多非常有用的方法,比如獲取目錄下的所有文件、判斷目錄下是否存在某個特定文件等。
不再贅述。