Excel VBA 编程基础 -- 现代文件处理(六)
前面我们已经讨论过 FileSystemObject、Folder 和 File 对象对文件夹和文件的操作,从今天开始我们讨论对文件的读写以及用于文件读写的 TextStream 对象。FSO.CreateTextFile 方法可以用来创建文本文件。一般格式是:FSO.CreateFile(filename[, overwrite [, unicode ]])其中,filename 指定要创建的文件名。可选 Boolean 类型参数 overwrite 表示覆盖已存在的同名文件,False 表示不覆盖,True 或 省略表示覆盖同名文件。可选 Boolean 类型参数 unicode 表示创建的文件是否以 Unicode 编码,True 表示使用 Unicode 编码表示文件内容,False 或省略则表示使用 ASCII 编码表示文件内容。例1. FSO.CreateTextFile 用法示例图1 FSO.CreateTextFile 用法示例本示例创建了两个文本文件,以 ASCII 编码的 at.txt,和以 Unicode 编码的 ut.txt。如下图所示:由图2 可见,at.txt 文件大小是 15 个字节,ut.txt 文件则是 24 个字节。同样的内容,因为使用的编码不同,文件大小也就不一样。由下面的十六进制导出可以看到,at.txt 是以单字节和双字节混合编码表示的。其中的单字节编码表示 Hello, 和一个空格,共 7 个字符,占用 7 字节。双字节编码表示 早上好! 4 个字符,占用 8 个字节。所以,at.txt 总共占用 7 + 8 = 15 字节。对于 ut.txt,因为使用了 Unicode 编码,所以所有字符都以双字节表示,7 个英文字符加4个中文字符共占用 (7 + 4) * 2 = 22 字节。另外,文件开头的 2 个字节 FF FE 表示这是一个 UTF-16LE 编码(&HFFFE 是 UTF-16LE 的标志)。所以,ut.txt 文件总共占用 22 + 2 = 24 字节。例2. FSO.CreateTextFile 用法示例图3 FSO.CreateTextFile 用法示例由这个例子可以看出,在 overwrite 参数为 False 且文件已存在的情况下,FSO.CreateTextFile 报“文件已存在”错误。这说明 FSO.CreateTextFile 方法忠实地履行了方法名称所表示的功能:该方法是用来创建文件的,而不是用来修改文件的。要修改已存在的文件,则需要使用 File.OpenAsTextStream 方法。FIle.OpenAsTextStream 方法打开指定的文件,返回 TextStream 对象,以便对文件进行读、写、追加等操作。File.OpenAsTextStream([ iomode [, format ]])其中,可选参数 iomode 表示输入/输出方向,可选参数 format 表示以何种编码方式打开文件,如果省略,则以 ASCII 编码方式打开文件。注:上表中,以只读方式打开的文件不可写入,以只写/附加方式打开的文件不可读取。因为文本文件涉及到字符以何种编码表示,因此,FSO.CreateTextFile 和 File.OpenAsTextStream 都提供了控制编码方式的参数。例1. File.OpenAsTextStream 用法示例图4 File.OpenAsTextStream 用法示例在本例中,打开 at.txt 文件时,没有指定 format 参数,表示以 ASCII 编码打开,因为 iomode 指定了 ForWriting,所以 at.txt 文件的原有内容被清除,然后写上新的内容。打开 ut.txt 时,iomode 参数使用 ForAppending,表示向文件追加内容,另外,format 参数使用 TriStateTrue,表示使用 Unicode 编码方式打开。这个例子执行以后,at.txt 和 ut.txt 的结果如下:at.txt 文件有 6 个字节,表示 at.txt 原来的内容已被清除,只有新写入的“你好!”三个字符,每个字符占用 2 字节,共 6 字节。ut.txt 文件有 30 个字节,原来的内容被保留,新增加了“你好!”三个字符,每个字符占用 2 字节,共 24 + 3 * 2 = 30 字节。