对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: est.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: est.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: est.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: est.txt", ForAppending) 7 Set wfsm2 = fso.OpenTextFile("d: est.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: est.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也还有许多非常有用的方法,比如获取目录下的所有文件、判断目录下是否存在某个特定文件等。
不再赘述。