VBS基础篇 - vbscript TextStream对象
文本流对象是VBScript操作文本文件的核心工具,通过文件系统对象创建或打开文本文件获取。方法包括写入、读取、读取一行、跳过、关闭,属性行尾、流尾、列、行控制读取位置。示例演示文件创建、读写、跳过。
TextStream 对象是 VBScript 中用来操作文本文件的核心工具,它在 FileSystemObject 体系中扮演着相当重要的角色。简单说,要读写文本文件,就得先拿到这个对象的句柄,而通常我们会通过 FileSystemObject 的 CreateTextFile() 或 OpenTextFile() 方法来完成这一步——相当于先找到文件,再打开一个可供操作的“通道”。

下面就来逐一拆解 TextStream 对象的方法和属性,看看它们到底能做什么,以及怎么用。
TextStream 对象的方法
| 方法 | 说明 |
| Close() | 关闭一个打开的文件 |
| Read(numchars) | 从文件中读出 numchars 个字符 |
| ReadAll() | 作为单个字符串读出整个文件 |
| ReadLine() | 作为一个字符串从文件中读出一行(直到回车符和换行) |
| Skip(numchars) | 当从文件读出时忽略 numchars 个字符 |
| SkipLine() | 当从文件读出时忽略下一行 |
| Write(string) | 向文件写入字符串 string |
| WriteLine(string) | 向文件写入字符串 string(可选)和换行符 |
| WriteBlankLines(n) | 向文件写入 n 个换行符 |
Close、Write、WriteLine 及 WriteBlankLines 的使用
Close() —— 关闭正在打开的文件,操作完成后记得调用,否则文件可能一直被占用。
WriteLine(string) —— 写入字符串并自动追加换行符,如果不传参数则只写入一个空行。
看个完整的例子,创建一个文件并写入内容:
Dim strPath,strText
strPath = "C:testing.txt"
strText = "This is Test !hello word !"
'调用函数
Call CreateFile(strPath,strText)
Sub CreateFile(strPath,strText)
Dim objFso,objStream
'创建FileSystemObject对象
Set objFso = CreateObject("Scripting.FileSystemObject")
'使用CreateTextFile()来返回一个TextStream对象句柄
Set objStream = objFso.CreateTextFile(strPath,True)
'三个Write的意思为:写入字符、写入带换行符的字符、写入3个换行符
objStream.Write(strText)
objStream.WriteLine(strText)
objStream.WriteBlankLines 3
'关闭TextStream对象
objStream.Close
End Sub
Read、ReadAll 及 ReadLine 的使用
Read(numchars) —— 从当前位置读取指定数量的字符,返回一个字符串。
ReadAll() —— 一次性读取整个文件内容,返回一个字符串。注意文件很大的时候慎用,容易撑爆内存。
ReadLine() —— 读取当前行(直到换行符,但不包含换行符本身),返回字符串。
下面的例子演示了三种读取方式的差异:
Call CreateFile("c:test.txt", "This is Test !" & vbCrLf & "hello word !")
Sub CreateFile(strPath,strText)
Dim objFso,objStream
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objStream = objFso.CreateTextFile(strPath,True)
objStream.WriteLine(strText)
'先读一行
Msgbox (objStream.ReadLine)
'重新以只读方式打开,再读取全部
Set objStream = objFso.OpenTextFile(strPath,1,true)
Msgbox (objStream.ReadAll)
'再次打开,只读前9个字符
Set objStream = objFso.OpenTextFile(strPath,1,true)
Msgbox (objStream.Read(9))
objStream.Close
End Sub
Skip、SkipLine 的使用
Skip(numchars) —— 读取时跳过指定数量的字符,相当于跳过前几个“坑位”。
SkipLine() —— 跳过一整行,直接从下一行开始读取。
来看如何用这两个方法跳过不想要的内容:
Dim strPath,strText
strPath = "C:test.txt"
Call CreateFile(strPath)
Sub CreateFile(strPath)
Dim objFso,objStream
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objStream = objFso.CreateTextFile(strPath,True)
objStream.Write "This is Test !" & vbCrLf & "hello word !"
'以只读方式打开
Set objStream = objFso.OpenTextFile(strPath,1,true)
objStream.Skip(5)
Msgbox objStream.ReadAll
Set objStream = objFso.OpenTextFile(strPath,1,true)
objStream.SkipLine
Msgbox objStream.ReadAll
objStream.Close
End Sub
TextStream 对象的属性
| 属性 | 说明 |
| AtEndOfLine | 如果文件位置指针在文件中一行的末尾则返回 True |
| AtEndOfStream | 如果文件位置指针在文件的末尾则返回 True |
| Column | 从 1 开始返回文件中当前字符的列号 |
| Line | 从 1 开始返回文件中当前行的行号 |
AtEndOfLine 与 AtEndOfStream 的区别
这两个属性经常用于循环控制,但容易混淆。简单总结:
AtEndOfLine 表示当前指针是否已经到达当前行的末尾(注意是“行”的末尾,不是文件末尾)。
AtEndOfStream 则表示是否已经到达整个文件的末尾。
下面的例子分别用这两个条件来逐字符读取文件,对比一下效果:
Dim strPath,strText
strPath = "C:test.txt"
Call CreateFile(strPath)
Sub CreateFile(strPath)
Dim objFso,objStream,str
Set objFso = CreateObject("Scripting.FileSystemObject")
'以只读方式打开,如果文件不存在则创建
Set objStream = objFso.OpenTextFile(strPath,1,true)
'如果不在行末,逐个字符读取
Do While objStream.AtEndOfLine <> true
str = str + objStream.Read(1)
Loop
msgbox str
str = ""
Set objStream = objFso.OpenTextFile(strPath,1,true)
'如果不在文件末尾,逐个字符读取
Do While objStream.AtEndOfStream <> true
str = str + objStream.Read(1)
Loop
MsgBox str
objStream.Close
End Sub
Column 与 Line 的使用
Column 返回当前字符的列号(从1开始),Line 返回当前行的行号(也是从1开始)。读取完整个文件后,可以用它们来获取文件的总行数以及最后一列的列号。
Call TestTextStream("c:test.txt")
Sub TestTextStream(strPath)
Dim objFso,objTStream,str
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objTStream = objFso.OpenTextFile(strPath,1)
Do While objTStream.AtEndOfStream <> true
objTStream.ReadAll
str = str + "共有" & objTStream.Line & "行数据,光标最后所在列号为:" & objTStream.Column & vbCrLf
Loop
MsgBox str
End Sub
实战:文本读取的几个常见需求
如何读取文本最后一行数据?
一个很典型的场景:日志文件需要取最后一行。循环读取直到文件末尾,最后一行的值自然就留下了。
Dim Fso,MyFile
Dim strLine
Set Fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = Fso.OpenTextFile("C:test.txt",1)
Do Until MyFile.AtEndOfStream
strLine = MyFile.ReadLine
Loop
MyFile.Close
MsgBox strLine
如果文件末尾有空行怎么办?
上面的方法在文件末尾有空行时会返回空字符串(空行)。改进的办法:只记录非空的行。
Dim Fso,MyFile
Dim strLine
Set Fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = Fso.OpenTextFile("C:test.txt",1)
Do Until MyFile.AtEndOfStream
strNextLine = MyFile.ReadLine
If Len(strNextLine) > 0 Then
strLine = strNextLine
End If
Loop
MyFile.Close
MsgBox strLine
读取文本指定行内容
我们知道行号之后,可以用计数的方式精准定位——每读一行减1,减到0就说明到达目标行,直接退出函数。
MsgBox TestTextStream("c:test.txt",1)
Function TestTextStream(strPath,IntLine)
Dim Fso,MyFile
Set Fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = Fso.OpenTextFile(strPath,1)
Do Until MyFile.AtEndOfStream
TestTextStream = MyFile.ReadLine
IntLine = IntLine - 1
If IntLine = 0 Then
Exit Function
End If
Loop
End Function
以上就是 TextStream 对象从方法到属性的完整梳理,配合几个典型需求的代码,基本能覆盖日常文件读写的所有场景了。实际使用时,记得留意文件路径的合法性以及读写权限,否则会抛出运行时错误。如果有什么遗漏的地方,欢迎在实践中补充。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















