FSO:File System Object(文本文件系统对象)
FSO是一个可以对系统文件进行操作的COM组件。对于自动化测试来说,FSO组件可以帮助我们方便快捷地解决文件处理上的问题。最常见的比如写测试日志,测试报告,上传具有一定规范格式的文本文件,构建测试文件夹结构,以及导出某个文本文件等各方面操作与应用。对于这些问题都可以用FSO对象来完成。
注释:COM对象:The Component Object Model 组件对象模型
COM组件是遵循COM规范编写、以Win32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行二进制代码,能够满足对组件架构的所有需求。
FSO对象模型主要由以下四个对象组成,主对象为FileSystemObject。Drive对象用的比较少。
FileSystemObject Object: 文件系统对象,操作计算机的文件系统。
Folder Object: 文件夹系统对象,提供存取文件夹的属性及操作。
TextStream Object: 文本流对象,提供存取文件内容。
Drive Object: 驱动器对象,管理和操作磁盘。
截图里就是FileSystemObject的所有属性跟对象。
下面简单列举文件夹操作,包括文件夹的增删拷贝。
Set fso = CreateObject("scripting.filesystemobject")
folderPath = "d:\sunyu"
folderBak = "f:\bak"
If fso.FolderExists(folderPath) Then
If fso.FolderExists(folderBak) Then
fso.DeleteFolder folderBak '如果备份文件夹已经存在了,则删除
End If
fso.CopyFolder folderPath,folderBak '删除sunyu这个文件夹前我们在f
'盘里做个备份,改名为bak
fso.DeleteFolder folderPath '如果文件夹已存在则删除
End If
Set myFolder = fso.CreateFolder(folderPath)'在D盘创建一个叫sunyu的文件夹
Set fso = Nothing
下面来尝试创建一个目录结构,并获取父文件夹下所有子文件夹的名称。
这是目标结构,主文件夹为sunyu,下面有三个文件夹
Set fso = CreateObject("scripting.filesystemobject")
folderPath = "d:\sunyu"
If fso.FolderExists(folderPath) Then
fso.DeleteFolder folderPath '如果文件夹已存在则删除
End If
Set myFolder = fso.CreateFolder(folderPath)'在D盘创建一个叫sunyu的文件夹
fso.CreateFolder folderPath + "\1"
fso.CreateFolder folderPath + "\2"
fso.CreateFolder folderPath + "\3"
'取子文件件名方式一
Set subFolders = fso.GetFolder("d:\").SubFolders.Item("sunyu").SubFolders
For Each f In subFolders
MsgBox f.Name
Next
'取子文件件名方式二
Set subFolders = myFolder.SubFolders
For Each f In subFolders
MsgBox f.Name
MsgBox f.ParentFolder.Name '获得父文件夹名
Next
Set fso = Nothing
为了让脚本可以重复执行,我首先会删除之前建立的文件夹。两种取子文件夹的方式都是比较常用的,我就写在了一个程序里。
下面我来列举文本文件的操作方式,主要包括三种模式
Const ForAppending = 8 '从文件末端开始继续写入
Const ForReading = 1 '读取模式
Const ForWriting = 2 '写入模式
Set fso = CreateObject("scripting.filesystemobject")
txtPath = "d:\test.txt"
'创建txt对象,返回TextStream对象
'True表示文件可被重写
Set txtFile = fso.CreateTextFile(txtPath,True)
'写入文本并换行
txtFile.WriteLine "hello Mr Sun"
'关闭文件
txtFile.Close
'打开先前建立的txt文件,ForReading模式
Set txtFile = fso.OpenTextFile(txtPath,ForReading,True)
'读取文件里所有内容
MsgBox txtFile.ReadAll
txtFile.Close
'打开先前建立的txt文件,ForAppending模式
Set txtFile = fso.OpenTextFile(txtPath,ForAppending,True)
txtFile.WriteLine "hello Ms G"
txtFile.Close
'打开先前建立的txt文件,ForReading模式
Set txtFile = fso.OpenTextFile(txtPath,ForReading,True)
MsgBox txtFile.ReadAll
txtFile.Close
'最后来看看ForWriting的效果
'打开先前建立的txt文件,ForWriting模式
Set txtFile = fso.OpenTextFile(txtPath,ForWriting,True)
txtFile.WriteLine "This is forWriting Model"
txtFile.Close
Set txtFile = fso.OpenTextFile(txtPath,ForReading,True)
MsgBox txtFile.ReadAll
Set txtFile = Nothing
Set fso = Nothing
注释比较详细,我每次读文件之前都会先关掉之前的TextStream,然后换成读取模式才能将文件里所有的内容打印出来。这是因为后续操作必须与IO模式一致才行,否则会出错。
关于三个读写模式,不必强记,在对象浏览器里可以找到。
以下是我三次打印的结果:
可以注意到,第三个打印结果,之前写入到txt文件里的字符串已经不存在了,ForWriting模式中,写入的字符串会覆盖掉原来的文字,而ForAppending模式下,会接在原来文字的末尾开始写,这是区别。
上一篇WshShell里说到过,FSO对象也可以用于获取当前路径,我们要实现的是,即使母文件夹移动了,其里面的所有文件的路径不会出现错误,这也是相对路径在自动化测试里最有用的地方。
首先我在D盘里创建一个文件夹,然后里面有两个文件如下:
我的目的是通过运行test.vbs里的脚本,可以读到test.txt文件里的内容。这样我就可以保证无论我的主文件夹移动到哪里,我只要运行test.vbs我就可以取得test.txt里的内容。我事先在test.txt里写了一段文字。
下面这段就是我写进test.vbs里的脚本。
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
myPath = fso.GetFolder(".")
Set txtFile = fso.OpenTextFile(myPath + "\test.txt",ForReading,True)
MsgBox txtFile.ReadAll
Set txtFile = Nothing
Set fso = Nothing
运行结果是:
“.”作为参数,是获取当前文件夹路径。当然了用GetFile方法也可以获得的。有兴趣的可以自己试试。有时间的话我再写写关于FSO生成QTP测试日志的介绍。