VBS中FileSystemObject对象详解(完整版)
FileSystemObject是IIS内置组件,用于操作磁盘、文件夹和文本文件,但无法直接处理二进制数据,必须借助ADODB.Stream对象进行转换。本文主要围绕FileSystemObject及其子对象TextStream展开,详细介绍驱动器、文件夹的常用属性与方法,所有代码在QTP9.0中测试通过。
FSO,全称 FileSystemObject 或 Scripting.FileSystemObject,是 IIS 内置的一个组件,专门用来操作磁盘、文件夹和文本文件。它的对象、方法和属性相当丰富,这里用实际示例的方式把最常用的部分梳理一遍。需要说明的是,微软官方文档中的《VBScript 语言参考》或《JScript 语言参考》里,包含了《FileSystemObject 用户指南》和《Scripting 运行时库参考》,那是完整参考的权威来源。

有一点需要先说明:FSO 不能直接操作二进制文件,如果需要处理二进制数据,得用 ADODB.Stream。下面这份整理主要围绕 FileSystemObject 和它的子对象 TextStream 展开,代码均在 QTP 9.0 中测试通过。
前言
学 VBScript 的时候,网上教程虽多,但大多数都把 FileSystemObject 放在 ASP 的上下文里讲,对于没接触过 ASP 的同学来说,看着确实头疼。所以干脆把 FileSystemObject 和 TextStream 中最常用的属性和方法单独拎出来,配合示例代码逐一说明。如果哪里有遗漏或偏差,欢迎指出。
FileSystemObject 对象概述
简单说,FileSystemObject 的作用就是提供对计算机文件系统的访问——用它可以在代码里操作文本文件、文件夹、驱动器。它本身有一个属性和一系列方法,通过这些方法又能衍生出多个从属对象(比如 Drive、Folder、File、TextStream)。我们先看整体轮廓,再逐一深入每个从属对象。
一、FileSystemObject 对象的属性
FileSystemObject 只有一个属性——Drivers(注意是 Drives 不是 Drivers,官方文档里写的是 Drives)。它返回当前机器上所有可用驱动器的列表。
表1 FileSystemObject 对象的属性和说明 |
|
属性 |
说明 |
Drivers |
返回本地计算机可用的驱动器列表 |
'如下脚本就可以获得FileSystemObject的Drivers属性
Set objFSO = CreateObject ("Scripting.FileSystemObject")
Set colDrivers = objFSO.Drivers
这个 Drives 集合里的每一个条目都是一个 Drive 对象。Drive 对象有哪些属性?看表2。
表2 Drive 对象的属性及说明 |
|
属性 |
说明 |
A vailableSpa ve |
考虑了帐户定额和/或其他限制,返回驱动器上对于该用户可用的空间的大小 |
DriveLetter |
返回驱动器的字母 |
DriveType |
返回驱动器的类型。返回值可以是 Unknown(0)、Removeable(1)、Fixed(2)、Network(3)、CDRom(4) 和 RamDisk(5)。需要留意,当前版本的 scrrun.dll 不支持预定义常数 Network,必须用十进制 3 代替 |
FileSystem |
返回驱动器文件系统的类型,比如“FAT”、“NTFS”、“CDFS” |
FreeSpace |
返回驱动器上可用剩余空间的总量 |
IsReady |
返回布尔值,表明驱动器是否已准备好 |
Path |
返回驱动器字母和冒号组成的路径,例如“C:” |
RootFolder |
返回代表驱动器根目录文件夹的 Folder 对象 |
SerialNumber |
返回识别磁盘卷的十进制序列号 |
ShareName |
如果是网络驱动器,返回该驱动器的网络共享名 |
TotalSize |
返回驱动器的总容量(字节) |
VolumeName |
设定或返回本地驱动器卷名 |
通过 Drives 集合里的 Drive 对象,咱就能高效地生成服务器上的驱动器列表——比挨个检查字母 A 到 Z 要聪明得多。还能顺便拿到每个驱动器的详细信息。下面是示例代码:
' 创建FileSystemObject对象
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 创建Drives集合,并赋值给colDrives
Set colDrives = objFSO.Drives
' 遍历Drives集合
For Each objDrive in colDrives
'判断驱动器是否已准备好
If objDrive.IsReady Then
msg = "驱动器的名称为:" & objDrive.DriveLetter & " "
msg =msg & "驱动器文件系统的类型:" & objDrive.FileSystem &" "
msg = msg & "驱动器的总容量:" & int(objDrive.TotalSize/(1024*1024*1024)) & "G "
msg = msg & "剩余空间的总量:" & int(objDrive.FreeSpace/(1024*1024*1024)) & "G "
End If
Next
reporter.ReportEvent micDone ,"遍历Drives集合",msg
有一点要特别提醒:运行这段代码前,如果 A 驱动器里没插软盘,或者光驱里没放光盘,就会抛出“Disk Not Ready”的错误。所以除了 DriveLetter 和 DriveType 属性之外,使用其他属性和方法前最好先检查每个驱动器的 IsReady 属性,这是一种安全保护措施。
二、FileSystemObject 对象的方法
1. 与驱动器有关的方法
表3 与驱动器有关的方法及说明 |
|
方法 |
说明 |
DriveExists(drivespec) |
如果 drivespec 中指定的驱动器存在,则返回 True,否则返回 False。drivespec 参数可以是驱动器字母,或者是文件、文件夹的完整绝对路径 |
GetDrive(drivespec) |
返回 drivespec 指定的驱动器所对应的 Drive 对象。drivespec 可以包含冒号、路径分隔符或网络共享名,例如:“C”、“C:”、“C:\”及“\\machinesharename” |
GetDriveName(drivespec) |
用字符串返回 drivespec 指定的驱动器的名称。drivespec 参数必须是文件或文件夹的绝对路径,或者仅仅是驱动器字母,例如:“c:”或“c” |
DriveExists 的使用
方法名:DriveExists(drivespec)
说明:判断指定驱动器是否存在,返回布尔值。drivespec 可以是单个字母,也可以是完整的路径。
示例:
' 创建FileSystemObject对象
Set objFSO = CreateObject ("Scripting.FileSystemObject")
For intCode = 65 To 90 'ANSI codes for 'A' to 'Z'
strLetter = Chr(intCode) 'Chr:返回与指定的 ANSI 字符代码相对应的字符。
If objFSO.DriveExists(strLetter) Then '判断相应的盘符是否存在,如存在输出
Reporter.ReportEvent micDone,"Show Drive”,” Found drive " & strLetter
End If
Next
如果已经知道要访问的驱动器、文件夹或文件,可以直接用 GetDrive、GetFolder、GetSpecialFolder 和 GetFile 方法获取对应的对象,省去中间的判断步骤。
2. 与文件夹有关的方法及属性
用 FileSystemObject 操作文件夹的方法如下:
表4 与文件夹有关的方法及说明 |
|
方法 |
说明 |
BuildPath(path,name) |
在已有路径 path 上追加 name 指定的文件或文件夹,必要时自动添加路径分隔符 '\' |
CopyFolder(source,destination,overwrite) |
从 source(可含通配符)复制一个或多个文件夹到 destination,包含源文件夹中所有文件。如果 source 含通配符或 destination 末尾是路径分隔符 '\',则 destination 视为目标文件夹;否则视为新文件夹的完整路径。overwrite 默认 True,设为 False 且目标已存在时出错 |
CreateFolder(foldername) |
创建路径为 foldername 的文件夹。如果已存在则出错 |
DeleteFolder(folderspec,force) |
删除 folderspec 指定的一个或多个文件夹(路径最后可含通配符),包含所有内容。force 为 True 时即使含只读文件也删除,默认 False |
FolderExists(folderspec) |
如果 folderspec 指定的文件夹存在则返回 True,否则 False。可以包含绝对/相对路径,或仅当前文件夹中的名称 |
GetAbsolutePathName(pathspec) |
返回明确指定文件夹的完整路径,考虑当前文件夹。例如当前文件夹是“c:\docs\sales”,pathspec 为“jan”,则返回“c:\docs\sales\jan”。支持通配符、\"..\"和\"\\\" |
GetFolder(folderspec) |
返回 folderspec 指定的文件夹对应的 Folder 对象 |
GetParentFolderName(pathspec) |
返回 pathspec 文件或文件夹的上一级文件夹(不检验是否存在) |
GetSpecialfolder(folderspec) |
返回特定 Windows 文件夹对应的 Folder 对象。参数允许值:WindowsFolder(0)、SystemFolder(1)、TemporaryFolder(2) |
MoveFolder(source,destination) |
将 source 指定的一个或多个文件夹移到 destination。source 可含通配符,destination 不能。如果 destination 末尾是路径分隔符则视为目标文件夹,否则视为新文件夹的完整路径。目标已存在时出错 |
CopyFolder 的使用
方法名:CopyFolder(source,destination,overwrite)
说明:递归复制文件夹。详细说明见表4。
示例:
' 创建FileSystemObject对象
Set objfso = createobject("scripting.FileSystemObject")
' 将D:/test下所有的内容复制到c:/123
objfso.CopyFolder "D:/test","c:/123"
注:如果 c:/123 不存在,QTP 会自动创建。
CreateFolder 及 DeleteFolder 的使用
方法名:CreateFolder(foldername) / DeleteFolder(folderspec,force)
说明:创建/删除指定文件夹。详细说明见表4。
示例:
' 创建FileSystemObject对象
Set objfso = createobject("scripting.FileSystemObject")
' 在c:/创建new folder文件夹,如果文件夹存在,则会出现错误提示
objfso.CreateFolder("c:/new folder")
' 删除c:/new folder文件夹
objfso.DeleteFolder("c:/new folder")
注:DeleteFolder 不论文件夹是否为空,都会直接删除。
FolderExists 的使用
方法名:FolderExist(folderspec)
说明:判断指定文件夹是否存在,返回布尔值。
示例:
Function hanshu(strpath)
Dim objfso,objset
' 创建FileSystemObjec对象
Set objfso = CreateObject("Scripting.FileSystemObject")
' 判断在指定的路径中是否有
If Not objfso.FolderExists(strpath) Then
objset = objfso.CreateFolder(strpath)
else
objset = objfso.DeleteFolder(strpath)
End If
hanshu = objset
End Function
hanshu("c:/new folder")
GetAbsolutePathName 的使用
方法名:GetAbsolutePathName(pathspec)
说明:根据提供的相对路径,返回绝对路径。
示例:
Dim objfso
'创建FileSystemObject对象
Set objfso = createobject("Scripting.FileSystemObject")
'返回当前的目录,下面两条语句返回一样的结果
msgbox (objfso.GetAbsolutePathName(""))
msgbox (objfso.GetAbsolutePathName("C:"))
GetFolder 的使用
方法名:GetFolder(folderspec)
说明:返回指定路径对应的 Folder 对象,之后可以访问该对象的属性。
示例:
Dim objfso,objset
'创建FileSystemObject对象
Set objfso = createobject("Scripting.FileSystemObject")
'返回C:/testing的Folder的对象
Set objset = objfso.GetFolder("C:/testing")
' 根据所返回的Folder对象,去访问其相关的属性
reporter.ReportEvent micDone ,"Folder对象的相关属性","文件夹创建的日期:" & objset.DateCreated &"; 文件夹所在的驱动:" & objset.Drive & "; 文件夹的名字:" & objset.Name
注:Folder 对象的属性下面会详细介绍。
GetParentFolderName 的使用
方法名:GetParentFolderName(pathspec)
说明:返回指定路径中最后一个文件或文件夹的父文件夹路径(字符串)。
示例:
Dim objfso
'创建FileSystemObject对象
Set objfso = createobject("Scripting.filesystemobject")
'使用GetParentFolderName方法来返回上一层文件夹
msgbox (objfso.GetParentFolderName("C:/WINDOWS/addins"))
GetSpecialFolder 的使用
方法名:GetSpecialFolder(folderspec)
说明:返回 Windows 特殊文件夹对应的 Folder 对象。
示例:
Dim fso,tempName
Set fso = CreateObject("Scripting.FileSystemObject")
'GetSpecialFolder()中的参数2,返回一个名为Temp的临时文件夹
Set tempName = fso.GetSpecialFolder(2)
msgbox tempName
MoveFolder 的使用
方法名:MoveFolder(source,destination)
说明:将一个或多个文件夹移动到目标位置。
示例:
Dim sourcepath,destination
sourcepath = "C:/testing"
destination = "C:/123"
'调用MoveFolders方法
call MoveFolders(sourcepath,destination)
Sub MoveFolders(sourcepath,destination)
Dim fso
'创建FileSystemObject对象
Set fso = CreateObject("Scripting.FileSystemObject")
'使用MoveFolder方法,将testing文件夹的内容移动到123文件夹下
fso.MoveFolder sourcepath,destination
End Sub
注意:如果运行前目标文件夹 123 已存在,会出错;另外 MoveFolder 不能跨磁盘移动。
上面提到的这些方法是基于 FileSystemObject 对象的。接下来看基于 Folder 对象本身的方法——它们不用再指定源路径,因为源就是当前文件夹自身。
Folder 对象所提供的方法
Folder 对象提供一组方法:Copy、Delete、Move、CreateTextFile。它们的功能与 FileSystemObject 的同名方法类似,但不需要 source 参数。
表5 Folder 对象的方法及说明 |
|
方法 |
说明 |
Copy(destination,overwrite) |
将当前文件夹及所有内容复制到 destination。destination 末尾是路径分隔符则视为目标文件夹,否则视为新文件夹的完整路径。overwrite 默认 True |
Delete(force) |
删除当前文件夹及所有内容。force 为 True 时可删除只读文件夹/文件,默认 False |
Move(destination) |
将当前文件夹及内容移动到 destination。若 destination 末尾是路径分隔符则视为目标文件夹,否则视为新文件夹路径。目标已存在则出错 |
CreateTextFile(filename,overwrite,unicode) |
在当前文件夹内创建指定文件,返回 TextStream 对象。overwrite 默认 False,unicode 默认 False |
Copy 的使用
方法名:Copy(destination,overwrite)
说明:将当前文件夹所有内容复制到目标文件夹。
示例:
Dim sourcepath
sourcepath = "C:/testing"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objset
Set fso = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objset = fso.getFolder(sourcepath)
'将testing中的所有内容复制到123文件夹中
objset.Copy("d:/123")
End Sub
如果目标文件夹不存在,脚本会自动创建。
Delete 的使用
方法名:Delete(force)
说明:删除当前文件夹及所有内容。
示例:
Dim sourcepath
sourcepath = "C:/testing"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objset
Set fso = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objset = fso.getFolder(sourcepath)
'将testingw文件夹及文件夹里所有的内容全部删除
objset.Delete(True)
End Sub
需要注意的是:如果文件夹属性为只读且 Delete 参数为 False,会提示“没有权限”;文件夹不存在时提示“路径未找到”。
Move 的使用
方法名:Move(destination)
说明:将当前文件夹及内容移动到目标位置。
示例:
Dim sourcepath
sourcepath = "C:/testing"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objset
Set fso = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objset = fso.getFolder(sourcepath)
'使用Move()将testing文件夹及里面所有的内容,移动到目标文件夹123中
objset.Move("C:/123")
End Sub
如果目标文件夹 123 已存在,会提示“文件已存在”;如果目标在 D: 盘,则会提示“没有权限”(不能跨磁盘移动)。
CreateTextFile 的使用
方法名:CreateTextFile(filename,overwrite,unicode)
说明:在当前文件夹内创建文件并返回 TextStream 对象。
示例:
Dim sourcepath
sourcepath = "C:/testing"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objset
Set fso = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objset = fso.getFolder(sourcepath)
'在testing文件夹下,使用CreateTextFile()创建myClass2.doc文件
objset.CreateTextFile "myClass2.doc",true
End Sub
CreateTextFile 创建的文件类型取决于扩展名(.txt、.doc、.exe 都可以)。当然,FileSystemObject 对象本身也支持 CreateTextFile,例如:fso.CreateTextFile “C:/testing/myClass.doc”,true。
Folder 对象所提供的属性
表6 Folder 对象的属性及说明 |
|
属性 |
说明 |
Attributes |
返回文件夹的属性。组合值如:Normal(0)、ReadOnly(1)、Hidden(2)、System(4)、Volume(名称)(8)、Directory(文件夹)(16)、Archive(32)、Alias(64)、Compressed(128)。例如隐藏只读文件夹值为 3 |
DateCreated |
返回文件夹的创建日期和时间 |
DateLastAccessed |
返回最后一次访问该文件夹的日期和时间 |
DateLastModified |
返回最后一次修改该文件夹的日期和时间 |
Drive |
返回该文件夹所在的驱动器字母 |
Files |
返回 Folder 对象包含的 Files 集合,表示该文件夹内所有文件 |
IsRootFolder |
返回布尔值,说明该文件夹是否是当前驱动器的根文件夹 |
Name |
设定或返回文件夹的名字 |
ParentFolder |
返回该文件夹的父文件夹对应的 Folder 对象 |
Path |
返回文件夹的绝对路径(长文件名) |
ShortName |
返回 DOS 风格的 8.3 形式的文件夹名 |
ShortPath |
返回 DOS 风格的 8.3 形式的文件夹绝对路径 |
Size |
返回该文件夹里所有文件和子文件夹的总大小 |
SubFolers |
返回该文件夹内所有子文件夹对应的 Folders 集合(包含隐藏和系统文件夹) |
Type |
返回文件夹的说明字符串(例如“Recycle Bin”) |
使用 GetFolder 获取 Folder 对象后,就可以访问这些属性了。下面举几个例子。
Drive、DateCreated、Name 属性的使用
Dim sourcepath
sourcepath = "C:/testing"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objset
Set fso = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objset = fso.getFolder(sourcepath)
'通过Folder对象来访问Folder属性
reporter.ReportEvent micDone ,"测试Folder属性","文件夹所在的磁盘为:" & objset.Drive & " 文件夹所创建的日期:" & objset.DateCreated & " 文件夹的名字为:" & objset.Name
End Sub
SubFolers 属性的使用
Dim sourcepath
sourcepath = "C:/Program Files/Common Files"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objset,objFolders,FolderName,i
i = 0
Set fso = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objset = fso.getFolder(sourcepath)
'SubFolders属性将返回所有子文件夹对应的Folder集合
Set objFolders = objset.SubFolders
'遍历Folder集合,统计出共有多少个文件夹,及相关文件夹的名字
For Each objFolder in objFolders
i = i +1
'vbcr为换行符
FolderName = FolderName + objFolder.Name + vbcr
Next
msgbox ("共有" & i &"个文件夹,文件夹的名字为:" & FolderName)
End Sub
Files 属性的使用
Dim objFso,objGetFolder,intCount,strFileName
intCount = 0
'创建FileSystemObject对象
Set objFso= CreateObject("Scripting.FileSystemObject")
'使用GetFolder()获得文件夹对象
Set objGetFolder = objFso.GetFolder("C:/test")
'遍历Files集合并显示文件夹中所有的文件名
For Each strFile in objGetFolder.Files
intCount = intCount + 1
strFileName =strFileName & "第" & intCount & "个文件夹名为:" & strFile.Name & vbcr
Next
msgbox strFileName
3. 与文件有关的方法及属性
用 FileSystemObject 操作文件的方法如下:
表7 与文件有关的方法及说明 |
|
方法 |
说明 |
CopyFile(source,destination,overwrite) |
将 source(可含通配符)指定的一个或多个文件复制到 destination。若 source 含通配符或 destination 末尾是路径分隔符,则 destination 视为文件夹;否则视为新文件的完整路径。overwrite 默认 True |
CreateTextFile(filename,overwrite,unicode) |
创建指定文件并返回 TextStream 对象。overwrite 默认 False,unicode 默认 False |
DeleFile(filespec,force) |
删除 filespec 指定的一个或多个文件(路径最后可含通配符)。force 为 True 时删除只读文件,默认 False |
FileExists(filespec) |
如果 filespec 指定的文件存在则返回 True,否则 False |
GetBaseName(filespec) |
返回 filespec 指定文件的名称(不含扩展名) |
GetExtensionName(filespec) |
返回 filespec 指定文件的扩展名 |
GetFile(filespec) |
返回 filespec 指定文件对应的 File 对象 |
GetFileName(pathspec) |
返回 pathspec 指定的文件或最后文件夹的名称(不检查是否存在) |
GetTempName() |
返回随机生成的临时文件名(仅提供名称,不创建文件) |
MoveFile(source,destination) |
将 source 指定的一个或多个文件移动到 destination。source 可含通配符,destination 不能。destination 末尾是路径分隔符视为文件夹,否则视为新文件路径。目标已存在则出错 |
OpenTextFile(filename,iomode,create,format) |
打开或创建文件,返回 TextStream 对象。iomode:1(只读,默认)、2(只写)、8(追加)。create 默认 False;format 0(ASCII)、-1(Unicode)、-2(系统默认) |
CopyFile 及 MoveFile 的使用
示例:
Dim sourcepath,targetpath
sourcepath = "C:/testing/*.txt"
targetpath = "C:/123/"
Call FolderAttributes(sourcepath,targetpath)
Sub FolderAttributes(sourcepath,targetpath)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
'将testing文件夹下所有扩展名名为.txt的文件,复制到123文件夹下
fso.CopyFile sourcepath,targetpath
fso.MoveFile sourcepath,targetpath
End Sub
如果 C:/123 文件夹不存在,运行时会提示“路径不存在”。
CreateTextFile 及 DeleteFile 的使用
示例:
Dim sourcepath
sourcepath = "C:/testing/ myClass2.doc "
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
'在testing文件夹下,使用CreateTextFile()创建myClass2.doc文件
fso.CreateTextFile sourcepath,true
'删除testing文件夹下,所有扩展名为.txt的文件
fso.DeleteFile sourcepath,true
End Sub
如果删除的文件为只读且 DeleteFile 参数为 false,会提示“没有权限”。
FileExists 的使用
示例:
Dim sourcepath
sourcepath = "C:/testing/test.txt"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
'判断C:/testing/test.txt是否有存在,如果存在返回“true”;否则返回“false”
If fso.FileExists(sourcepath) Then
msgbox "true"
else
msgbox "false"
End If
End Sub
GetBaseName、GetFileName 及 GetExtensionName 的使用
示例:
Dim sourcepath
sourcepath = "C:/testing/test.txt"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
'返回文件名test, 扩展名 txt, 文件名+扩展名 test.txt
Msgbox (fso.GetBaseName(sourcepath))
Msgbox (fso. GetExtensionName(sourcepath))
Msgbox (fso.GetFileName(sourcepath))
End Sub
GetFile 的使用
示例:
Dim sourcepath
sourcepath = "C:/testing/778899.txt"
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objFile
Set fso = CreateObject("Scripting.FileSystemObject")
'调用GetFile()返回File对象,通过File对象来访问其下的属性
set objFile = fso.GetFile(sourcepath)
reporter.ReportEvent micDone,"访问file的属性","该文件所在的盘符为:" & objFile.Drive & " 文件名为:" & objFile.Name
End Sub
File 对象的属性将在下面介绍。
GetTempName 的使用
示例:
Dim fso, tempfile
'创建FileSystemObject对象
Set fso = CreateObject("Scripting.FileSystemObject")
'调用CreateTempFile函数,并将对象赋值给tempfile
Set tempfile = CreateTempFile
'在临时文件中写入字符
tempfile.WriteLine "世界你好"
'关闭对象
tempfile.Close
Function CreateTempFile
Dim tfolder, tname, tfile
Const TemporaryFolder = 2
'GetSpecialFolder()中的参数2,返回一个名为Temp的临时文件夹
Set tfolder = fso.GetSpecialFolder(TemporaryFolder)
'随机生成一个临时文件名
tname = fso.GetTempName
'在Temp临时文件夹下面,创建一个临时文件
Set tfile = tfolder.CreateTextFile(tname)
'将结果赋值给函数
Set CreateTempFile = tfile
End Function
GetTempName 只生成文件名,不创建文件。示例中生成的临时文件默认保存在 C:\Documents and Settings\Administrator\Local Settings\Temp。
OpenTextFile 的使用
示例:
Dim spec
spec = "C:/testing.txt"
'三个参数的分别为:以只读模式打开文件、以只写方式打开文件、打开文件并在文件末尾进行写操作
Const intForReading = 1,intForWriting = 2,intForAppending = 8
'调用OpenTextFileTest()
Call OpenTextFileTest(spec,intForAppending)
Sub OpenTextFileTest(sepc,intForAppending)
Dim fso,objTStream
'创建FileSystemObject对象
Set fso = CreateObject("Scripting.FileSystemObject")
'参数true表示:如果文件不存在,则创建文件。最后OpenTextFile()将返回TextStream对象
Set objTStream = fso.OpenTextFile(sepc,intForAppending,true)
'利用TextStream对象来将字符串写入文件
objTStream.write "hello word!"
'释放TextStream对象
objTStream.close
End Sub
File 对象所提供的属性
表8 File 对象的属性及说明 |
|
属性 |
说明 |
Attributes |
返回文件的属性。组合值参考表6 |
DateCreated |
返回该文件的创建日期和时间 |
DateLastAccessed |
返回最后一次访问该文件的日期和时间 |
DateLastModified |
返回最后一次修改该文件的日期和时间 |
Drive |
返回该文件所在的驱动器的 Drive 对象 |
Name |
设定或返回文件的名字 |
ParentFolder |
返回该文件的父文件夹的 Folder 对象 |
Path |
返回文件的绝对路径(长文件名) |
ShortName |
返回 DOS 风格的 8.3 形式的文件名 |
ShortPath |
返回 DOS 风格的 8.3 形式的文件绝对路径 |
Size |
返回该文件的大小(字节) |
Type |
返回文件类型的说明字符串(例如“.txt 文件”对应“Text Document”) |
访问 File 对象属性的方式与 Folder 对象类似,通过 GetFile 拿到 File 对象后直接读取即可。前面已经有示例,不再重复列举。
TextStream 对象概述
TextStream 对象专门用于访问文本文件,它是 FileSystemObject 的一个独立附属对象。使用它时,需要先通过 FileSystemObject 或其附属对象(如 Folder.CreateTextFile)获得一个 TextStream 对象句柄。常用的获取方式有 CreateTextFile 和 OpenTextFile 两种方法。
一、TextStream 对象的方法
表9 TextStream 对象的方法及说明 |
|
方法 |
说明 |
Close() |
关闭打开的文件 |
Read(numchars) |
从文件中读出 numchars 个字符 |
ReadAll() |
将整个文件作为单个字符串读出 |
ReadLine() |
读出一行(直到回车/换行符,不包含换行符) |
Skip(numchars) |
读取时忽略 numchars 个字符 |
SkipLine() |
读取时忽略下一行 |
Write(string) |
向文件写入字符串 string |
WriteLine(string) |
写入字符串(可选)并追加换行符 |
WriteBlankLines(n) |
写入 n 个换行符 |
Close、Write、WriteLine 及 WriteBlankLines 的使用
示例:
Dim strPath,strText
strPath = "C:/testing.txt"
strText = "This is Test !" & vbCrLf & “hello word !”
'调用函数
Call CreateFile(strPath,strText)
Sub CreateFile(strPath,strText)
Dim objFso,objStream
'创建FileSystemObject对象
Set objFso = CreateObject("Scripting.FileSystemObject")
'使用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 的使用
示例:
Sub CreateFile(strPath,strText)
Dim objFso,objStream
'创建FileSystemObject对象
Set objFso = CreateObject("Scripting.FileSystemObject")
'使用FileSystemObject对象的CreateTextFile(),来返回一个TextStream对象句柄
Set objStream = objFso.CreateTextFile(strPath,True)
'写入字符
objStream.WriteLine(strText)
Set objStream = objFso.OpenTextFile(strPath,1,true)
msgbox (objStream.ReadLine)
'msgbox (objStream.ReadAll)
' msgbox (objStream.Read(Len(strText)))
'关闭TextStream对象
objStream.Close
End Sub
Skip、SkipLine 的使用
示例:
Dim strPath,strText
strPath = "C:/testing.txt"
'调用函数
Call CreateFile(strPath)
Sub CreateFile(strPath)
Dim objFso,objStream
'创建FileSystemObject对象
Set objFso = CreateObject("Scripting.FileSystemObject")
'使用FileSystemObject对象的CreateTextFile(),来返回一个TextStream对象句柄
Set objStream = objFso.CreateTextFile(strPath,True)
'在文本中写入字符
objStream.Write "This is Test !" & vbCrLf & "hello word !"
'以只读的方式打开文件
Set objStream = objFso.OpenTextFile(strPath,1,true)
'读取文件时跳过5个字符;或者跳过当前行,读取下一行
objStream.Skip(5)
'objStream.SkipLine
'读取文本内容
msgbox objStream.ReadAll
'关闭TextStream对象
objStream.Close
End Sub
区别:Skip 跳过指定字符数,SkipLine 跳过整行。
二、TextStream 对象的属性
表10 TextStream 对象的属性及说明 |
|
属性 |
说明 |
AtEndOfLine |
如果文件指针在行末则返回 True(仅对只读模式打开的文件有效) |
AtEndOfStream |
如果文件指针在文件末尾则返回 True(仅对只读模式打开的文件有效) |
Column |
从 1 开始返回当前字符的列号 |
Line |
从 1 开始返回当前行的行号 |
AtEndOfLine 及 AtEndOfStream 的使用
示例:
Dim strPath,strText
strPath = "C:/testing.txt"
'调用函数
Call CreateFile(strPath)
Sub CreateFile(strPath)
Dim objFso,objStream,str
'创建FileSystemObject对象
Set objFso = CreateObject("Scripting.FileSystemObject")
'以只读的方式打开文件,如果文件不存在则创建它
Set objStream = objFso.OpenTextFile(strPath,1,true)
'如果当前的指针不在行末,则读取文本内容
Do While objStream.AtEndOfLine <> true
‘Do While objStream.AtEndOfStream <> true
str = str + objStream.Read(1)
Loop
msgbox str
'关闭TextStream对象
objStream.Close
End Sub
AtEndOfLine 读到当前行末尾停止,AtEndOfStream 读到整个文件末尾停止。
Column 及 Line 的使用
示例:
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
'打印信息
print str
End Sub
FileSystemObject 实例代码
最后,把常用的操作整理成几个完整示例,方便直接复制使用。
创建文件
set fso = server.CreateObject("Scripting.FileSystemObject")
set f = fso.CreateTextFile("C:test.txt", true) '第二个参数表示目标文件存在时是否覆盖
f.Write("写入内容")
f.WriteLine("写入内容并换行")
f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
f.Close()
set f = nothing
set fso = nothing
打开并读文件
set fso = server.CreateObject("Scripting.FileSystemObject")
set f = fso.OpenTextFile("C:test.txt", 1, false) '第二个参数 1 表示只读打开,第三个参数表示目标文件不存在时是否创建
f.Skip(3) '将当前位置向后移三个字符
f.SkipLine() '将当前位置移动到下一行的第一个字符,注意:无参数
response.Write f.Read(3) '从当前位置向后读取三个字符,并将当前位置向后移三个字符
response.Write f.ReadLine() '从当前位置向后读取直到遇到换行符(不读取换行符),并将当前位置移动到下一行的第一个字符,注意:无参数
response.Write f.ReadAll() '从当前位置向后读取,直到文件结束,并将当前位置移动到文件的最后
if f.atEndOfLine then
response.Write("一行的结尾!")
end if
if f.atEndOfStream then
response.Write("文件的结尾!")
end if
f.Close()
set f = nothing
set fso = nothing
打开并写文件
set fso = server.CreateObject("Scripting.FileSystemObject")
set f = fso.OpenTextFile("C:test.txt", 2, false) '第二个参数 2 表示重写,如果是 8 表示追加
f.Write("写入内容")
f.WriteLine("写入内容并换行")
f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
f.Close()
set f = nothing
set fso = nothing
判断文件是否存在
set fso = server.CreateObject("Scripting.FileSystemObject")
if fso.FileExists("C:test.txt") then
response.Write("目标文件存在")
else
response.Write("目标文件不存在")
end if
set fso = nothing
移动文件
set fso = server.CreateObject("Scripting.FileSystemObject")
call fso.MoveFile("C:test.txt", "D:test111.txt") '两个参数的文件名部分可以不同
set fso = nothing
复制文件
set fso = server.CreateObject("Scripting.FileSystemObject")
call fso.CopyFile("C:test.txt", "D:test111.txt") '两个参数的文件名部分可以不同
set fso = nothing
删除文件
set fso = server.CreateObject("Scripting.FileSystemObject")
fso.DeleteFile("C:test.txt")
set fso = nothing
创建文件夹
set fso = server.CreateObject("Scripting.FileSystemObject")
fso.CreateFolder("C:test") '目标文件夹的父文件夹必须存在
set fso = nothing
判断文件夹是否存在
set fso = server.CreateObject("Scripting.FileSystemObject")
if fso.FolderExists("C:Windows") then
response.Write("目标文件夹存在")
else
response.Write("目标文件夹不存在")
end if
set fso = nothing
删除文件夹
set fso = server.CreateObject("Scripting.FileSystemObject")
fso.DeleteFolder("C:test") '文件夹不必为空
set fso = nothing
检测驱动器 C 盘是否存在
Set fso = Server.CreateObject("Scripting.FileSystemObject")
fso.DriveExists("c:")
获取文件路径的驱动器名
Set fso=Server.CreateObject("Scripting.FileSystemObject")
p=fso.GetDriveName(Server.MapPath("aqa33"))
Response.Write("驱动器名称是:" & p)
set fs=nothing
取得某个指定的路径的父文件夹的名称
Set fso=Server.CreateObject("Scripting.FileSystemObject")
p=fso.GetParentFolderName(Server.MapPath("aqa331.asp"))
Response.Write("父文件夹名称是:" & p)
set fs=nothing
取得指定路径中的最后一个成分的文件扩展名
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Response.Write(fs.GetExtensionName(Server.MapPath("aqa33.asxd")))
set fs=nothing
取得指定路径中的最后一个成分的文件名
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Response.Write(fs.GetFileName(Server.MapPath("aqa33.asxd")))
set fs=nothing
返回在指定的路径中文件或者文件夹的基本名称
Set fso=Server.CreateObject("Scripting.FileSystemObject")
Response.Write(fso.GetBaseName("c:windowscursorsabc.cur"))
Response.Write("
")
Response.Write(fso.GetBaseName("c:windowscursors"))
Response.Write("
")
Response.Write(fso.GetBaseName("c:windows"))
set fso=nothing
以上就是 FileSystemObject 和 TextStream 的完整梳理,从驱动器、文件夹到文件、文本流,基本上日常用到的操作都覆盖了。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















