VBS脚本编程(7)——文件与文件夹的操作
FileSystemObject 对象
FileSystemObject 对象的作用:提供对计算机文件系统的访问,它允许我们在代码内操作文本文件、文件夹及驱动器。FileSystemObject 对象提供一个属性和一系列方法,可用它们来操纵 FileSystemObject 对象实现的一些从属对象。这里提供了全部的内容概要,然后介绍每一个从属对象。
FileSystemObject对象的属性
FileSystemObject 对象只有一个属性,它用于得到当前机器上的所有有效驱动器的列表。
‘如下脚本就可以获得FileSystemObject的Drivers属性
Set objFSO = CreateObject ("Scripting.FileSystemObject")
Set colDrivers = objFSO.Drivers
正如已经看到的,FileSystemObject 对象包含一个属性——Drives,它返回一个包括本地计算机上所有可用驱动器的集合。
因此,通过使用 Drives 集合里的 Drive 对象,可以在服务器上产生一个驱动器列表,与通过检查每个可能的驱动器字母来判别驱动器是否存在的方法相比,效率更高。我们也可以得到关于该驱动器的信息。
示例:
' 创建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 & VBCrlf
msg =msg & "驱动器文件系统的类型:" & objDrive.FileSystem & VBCrlf
msg = msg & "驱动器的总容量:" & int(objDrive.TotalSize/(1024*1024*1024)) & "G "& VBCrlf
msg = msg & "剩余空间的总量:" & int(objDrive.FreeSpace/(1024*1024*1024)) & "G "
End If
Next
msgbox msg
备注:在系统上运行这段程序以前有一点要注意。如果在 A 驱动器里没有磁盘,或 CD-ROM 驱动器里没有光盘,将得到一个错误提示:“Disk Not Ready”。除了 DriveLetter 属性和 DriveType 属性外,在使用其他属性和方法前,通过检查每个驱动器的 IsReady 属性,可以保护该页面。
FileSystemObject对象的方法
- 与驱动器有关的方法
DriveExists的使用
方法名:DriveExists(drivespec)
说明:如果在 drivespec 中指定的驱动器存在,则返回 True,否则返回 False。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 '判断相应的盘符是否存在,如存在输出
MsgBox "存在 "&strLetter&": 驱动器"
End If
Next
- 与文件夹有关的方法
用FileSystemObject对象来操作文件夹的方法:
CopyFolder的使用
方法名:CopyFolder(source,destination,overwrite)
说明:将文件夹从某位置递归复制到另一位置。
示例:
' 创建FileSystemObject对象
Set objFSO = CreateObject("Scripting.FileSystemObject")
' 将D:\Test下所有的内容复制到C:\123
objFSO.CopyFolder "D:\Test","C:\123"
CreateFolder及DeleteFolder的使用
方法名:CreateFolder(foldername)/DeleteFolder(folderspec,force)
说明:创建/删除一个路径名为 foldername 的文件夹。
示例:
' 创建FileSystemObject对象
Set objfso = createobject("scripting.FileSystemObject")
‘ 在c:/创建new folder文件夹,如果文件夹存在,则会出现错误提示
objfso.CreateFolder("c:/new folder")
‘ 删除c:/new folder文件夹
objfso.DeleteFolder("c:/new folder")
注:DeleteFolder无论文件夹是否包含内容,都将删除该文件夹
FolderExists的使用
方法名:FolderExists(folderspec)
说明:如果指定的文件夹存在,则返回 True;否则返回 False。
示例:
Function hanshu(strpath)
Dim objFSO,objSet
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExists(strpath) Then
objSet = objFSO.CreateFolder(strpath)
MsgBox "文件夹创建成功"
Else
objSet = objFSO.DeleteFolder(strpath)
MsgBox "文件夹删除成功"
End If
hanshu = objSet
End Function
path = InputBox("请输入文件夹路径")
hanshu(path)
GetAbsolutePathName的使用
方法名:GetAbsolutePathName(pathspec)
说明:从提供的指定路径中返回完整且含义明确的路径。
示例:
Dim objFSO
'创建FileSystemObject对象
Set objFSO = CreateObject("Scripting.FileSystemObject")
'返回当前的目录,下面两条语句返回一样的结果
MsgBox(objFSO.GetAbsolutePathName(""))
MsgBox(objFSO.GetAbsolutePathName("c:"))
GetFolder的使用
方法名:GetFolder(folderspec)
说明:返回与指定的路径中某文件夹相应的 Folder 对象。可以根据所返回的Folder 对象,再去访问该Folder 对象所持有的属性。
示例:
Dim objFSO,objSet,strPath
'创建FileSystemObject对象
Set objFSO = CreateObject("Scripting.FileSystemObject")
strPath = InputBox("请输入文件夹的路径")
Set objSet = objFSO.GetFolder(strPath)
' 根据所返回的Folder对象,去访问其相关的属性
MsgBox("文件夹创建的日期:"&objSet.DateCreated&vbCrLf&"文件夹所在驱动:"&objSet.Drive&vbCrLf&"文件夹名称:"&objSet.Name)
GetParentFolderName的使用
方法名:GetParentFolderName(pathspec)
说明:返回字符串,该字符串包含指定的路径中最后一个文件或文件夹的父文件夹。
示例:
Dim objFSO
'创建FileSystemObject对象
Set objFSO = CreateObject("Scripting.FileSyStemObject")
'使用GetParentFolderName方法来返回上一层文件夹
MsgBox(objFSO.GetParentFolderName("C:\Windows\System32"))
GetSpecialFolder的使用
方法名:GetSpecialFolder(folderspec)
说明:返回指定的特殊文件夹。
示例:
Dim objFSO,tempName
Set objFSO = CreateObject("Scripting.FileSystemObject")
'GetSpecialFolder()中的参数2,返回一个名为Temp的临时文件夹
Set tempName = objFSO.GetSpecialFolder(2)
MsgBox tempName
MoveFolder的使用
方法名:MoveFolder(source,destination)
说明:将一个或多个文件夹从某位置移动到另一位置。
示例:
Dim Source,Destination
Source = InputBox("请输入原文件夹")
Destination = InputBox("请输入目标文件夹")
'调用MoveFolders方法
Call MoveDir(Source,Destination)
Sub MoveDir(s,d)
Dim FSO
'创建FileSystemObject对象
Set FSO = CreateObject("Scripting.FileSystemObject")
'使用MoveFolder方法,将原文件夹移动到目标文件夹
FSO.MoveFolder s,d
End Sub
注:如果脚本在运行前目标文件夹已存在,则运行是会发生错误;在不同的磁盘下MoveFolder方法不能用
上面提到的Folder方法是基于FileSystemObject 对象的,现在我们来看看基于Folder对象的方法。
Folder子对象的方法
Folder 对象提供一组可用于复制、删除和移动当前文件夹的方法。这些方法的运行方式与 FileSystemObject 对象的CopyFolder、DeleFolder 和 MoveFolder 方法相同,但这些方法不要求 source 参数,因为源文件就是这个文件夹。
备注:CopyFolder、DeleFolder等方法是基于FileSystemObject 对象的;而下面的Copy、Delete等方法是基于FileSystemObject对象下的Folder对象,他们实现的功能是类似的。
Copy的使用
方法名:Copy(destination,overwrite)
说明:将文件夹的所有内容,复制到destination文件夹中。
示例:
Dim Source,Destination
Source = InputBox("请输入原文件夹")
Destination = InputBox("请输入目标文件夹")
Call Copyx(Source,Destination)
Sub Copyx(s,d)
Dim FSO,objSet
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objSet = FSO.GetFolder(s) '使用GetFolder方法来返回Folder对象
objSet.Copy(d) '使用Copy方法将原文件夹中的内容复制到目标文件夹中
End Sub
备注:如果目标文件夹不存在,则脚本在运行是将自动创建
Delete的使用
方法名:Delete(force)
说明:删除文件夹及里面的所有内容。
示例:
Dim path
path = InputBox("请输入要删除的文件夹")
Call Del(path)
Sub Del(p)
Dim FSO,ObjSet
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ObjSet = FSO.GetFolder(p)
ObjSet.Delete(True)
End Sub
备注:如果文件夹属性为只读且Delete的参数为False,则脚本在运行是将提示“没有权限”;当文件夹不存在时,将提示“路径未找到”。
Move的使用
方法名:Move(destination)
说明:将文件夹及里面所有的内容移动到 destination 指定的文件夹。
示例:
Dim Source,Destination
Source = InputBox("请输入原文件夹")
Destination = InputBox("请输入目标文件夹")
Call Movex(Source,Destination)
Sub Movex(s,d)
Dim FSO,objSet
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objSet = FSO.GetFolder(s)
objSet.Move(d)
End Sub
CreateTextFile的使用
方法名:CreateTextFile(filename,overwrite,unicode)
说明:创建指定文件并返回 TextStream 对象,该对象可用于读或写创建的文件。
示例:
Dim strPath,strFile
strPath = InputBox("请输入创建文件夹的路径")
strFile = InputBox("请输入文件名称")
Call CreateFilex(strPath,strFile)
Sub CreateFilex(path,file)
Dim FSO,objSet
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objSet = FSO.GetFolder(path)
objSet.CreateTextFile file,True
End Sub
备注:CreateTextFile()所创建的文件类型是根据所提供的扩展名来确定的,FileSystemObject对象也可以调用CreateTextFile()
Folder子对象的属性
如上面提到的,我们可以使用下面的脚本来访问Folder对象
Dim objfso,objset
'创建FileSystemObject对象
Set objfso = createobject("Scripting.FileSystemObject")
'返回C:/testing的Folder的对象
Set objset = objfso.GetFolder("C:\testing")
注:通过Folder对象我们就可以访问其提供的方法及属性
Drive、DateCreated、Name属性的使用
示例:
Dim path
path = InputBox("请输入文件夹路径")
Call FolderAttributes(path)
Sub FolderAttributes(sourcepath)
Dim FSO,objSet
Set FSO = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objSet = FSO.getFolder(sourcepath)
'通过Folder对象来访问Folder属性
MsgBox ("文件夹所在磁盘为:"&objSet.Drive&vbCrLf&"文件夹创建的日期:"&objSet.DateCreated&vbCrLf&"文件夹的名称为:"&objSet.Name)
End Sub
SubFolers属性的使用
示例:
Dim path
path = InputBox("请输入文件夹路径")
Call FolderAttributes(path)
Sub FolderAttributes(sourcepath)
Dim FSO,objSet,objFolders,objFolder,FolderName,i
Set FSO = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objSet = FSO.getFolder(sourcepath)
'SubFolders属性将返回所有子文件夹对应的Folder集合
Set objFolders = objSet.SubFolders
i = 0
For Each objFolder In objFolders
i = i+1
FolderName = FolderName&objFolder.Name&vbCr
Next
MsgBox (sourcepath&"路径下共有"&i&"个文件夹,文件夹的名称为:"&vbCrLf&FolderName)
End Sub
Files属性的使用
示例:
Dim path
path = InputBox("请输入文件夹路径")
Call FolderAttributes(path)
Sub FolderAttributes(sourcepath)
Dim FSO,objSet,objFiles,objFile,FileName,i
Set FSO = CreateObject("Scripting.FileSystemObject")
'使用GetFolder方法来返回Folder对象
Set objSet = FSO.getFolder(sourcepath)
'遍历Files集合并显示文件夹中所有的文件名
Set objFiles = objSet.Files
i = 0
For Each objFile In objFiles
i = i+1
FileName = FileName&"("&i&")"&objFile.Name&vbCr
Next
MsgBox (sourcepath&"路径下共有"&i&"个文件,文件的名称为:"&vbCrLf&FileName)
End Sub
- 与文件有关的方法及属性
用FileSystemObject对象来操作文件的方法:
CopyFile及MoveFile的使用
方法名:CopyFile(source,destination,overwrite)
说明:将一个或多个文件从某位置复制到另一位置。
方法名:MoveFile(source,destination)
说明:将 source 指定的一个或多个源文件移动到 destination 指定的目的文件夹。
示例:
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的使用
方法名:CreateTextFile(filename,overwrite,unicode)
说明:创建指定文件并返回 TextStream 对象,该对象可用于读或写创建的文件。
方法名:DeleFile(filespec,force)
说明:删除指定的文件。
示例:
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
FileExists的使用
方法名:FileExists(filespec)
说明:判断所指定的文件是否存在。此方法将返回Bool值。
示例:
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的使用
方法名:GetBaseName(filespec)
说明:返回字符串,文件 (不带扩展名), 或者提供的路径说明中的文件夹。
方法名:GetExtensionName(filespec)
说明:返回字符串,该字符串包含路径最后一个组成部分的扩展名。
方法名:GetFileName(pathspec)
说明:返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。
示例:
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的使用
方法名:GetFile(filespec)
说明:返回与指定路径中某文件相应的 File 对象,既而可以访问到File的属性。
示例:
Sub FolderAttributes(sourcepath)
Dim fso,objFile
Set fso = CreateObject("Scripting.FileSystemObject")
'调用GetFile()返回File对象,通过File对象来访问其下的属性
set objFile = fso.GetFile(sourcepath)
MsgBox("该文件所在的盘符为:"&objFile.Drive&vbCrLf&"文件名为:"&objFile.Name)
End Sub
GetTempName的使用
方法名: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
OpenTextFile的使用
方法名:(filename,iomode,create,format)
说明:打开指定的文件并返回一个 TextStream 对象,可以读取、写入此对象或将其追加到文件。
示例:
Dim path
path = InputBox("请输入文件的位置")
strContent = InputBox("请输入追加的内容")
'三个参数的分别为:以只读模式打开文件、以只写方式打开文件、打开文件并在文件末尾进行写操作
Const intForReading = 1,intForWriting = 2,intForAppending = 8
'调用OpenTextFileTest()
Call OpenText(path,intForAppending,strContent)
Sub OpenText(path,intForAppending,strContent)
Dim FSO,objTStream
'创建FileSystemObject对象
Set FSO = CreateObject("Scripting.FileSystemObject")
'参数true表示:如果文件不存在,则创建文件。最后OpenTextFile()将返回TextStream对象
Set objTStream = FSO.OpenTextFile(path,intForAppending,True)
'利用TextStream对象来将字符串写入文件
objTStream.Write strContent
'释放TextStream对象
objTStream.Close
End Sub
File子对象的属性
我们在前面File对象的方法中曾提到,可以使用FileSystemObject对象的GetFile()来访问File对象属性。
访问File对象属性的示例如下:
Dim sourcepath
sourcepath = InputBox("请输入文件所在的路径")
Call FolderAttributes(sourcepath)
Sub FolderAttributes(sourcepath)
Dim fso,objFile
Set fso = CreateObject("Scripting.FileSystemObject")
'调用GetFile()返回File对象,通过File对象来访问其下的属性
set objFile = fso.GetFile(sourcepath)
MsgBox("该文件所在的盘符为:"&objFile.Drive&vbCrLf&"文件名为:"&objFile.Name)
End Sub
备注:File对象属性的使用方法和前面介绍的Folder对象属性的使用方法一样,所以在这不一一列出。
TextStream对象
TextStream对象是用于访问文本文件的对象,它是FIleSystemObject一个独立的附属对象,但在使用TextStream对象时,我们仍要借助FileSystemObject对象或其附属对象来创建一个TextStream对象访问磁盘文件的内容。可以通过FileSystemObject对象的CreateTextFile()及OpenTextFile(),来获取TextStream的对象句柄。
下面我们来具体的看看TextStream 对象的方法及属性的使用。
TextStream对象的方法
Close、Write、WriteLine及WriteBlankLines的使用
方法名:Close()
说明:关闭正在打开的文件
方法名:WriteLine(string)
说明:向文件写入字符串 string(可选)和换行符。
示例:
Dim strPath,strText
strPath = "c:\users\text.txt"
strText = "This is a test"
Call CreateFile(strPath,strText)
Sub CreateFile(Path,Text)
Dim objFSO,objStream
'创建FileSystemObject对象
Set objFSO = CreateObject("Scripting.FileSystemObject")
'使用FileSystemObject对象的CreateTextFile(),来返回一个TextStream对象句柄
Set objStream = objFSO.CreateTextFile(Path,True)
'三个Write的意思分别为:写入3个换行符、写入带换行符的字符、在文本中写入字符
objStream.WriteBlankLines 3
objStream.WriteLine(Text)
objStream.Write(Text)
'关闭TextStream对象
objStream.Close
End Sub
Read、ReadAll及ReadLine的使用
方法名:Read(numchars)
说明:从 TextStream 文件中读入指定数目的字符并返回结果字符串。
方法名:ReadAll()
说明:读入全部 TextStream 文件并返回结果字符串。
方法名:ReadLine()
说明:从 TextStream 文件中读入一整行字符(直到下一行,但不包括下一行字符),并返回结果字符串。
示例:
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的使用
方法名:Skip(numchars)
说明:读取 TextStream 文件时跳过指定数目的字符
方法名:SkipLine()
说明:当读到 TextStream 文件时,跳过下一行。
示例:
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对象的属性
TextStream 的属性提供有关文件内文件指针当前位置的信息,如表9所示。注意,所有的属性是只读的。
AtEndOfLine 和 AtEndOfStream 属性仅对以 iomode 参数为 ForReading 的方式打开的文件可用,否则将会出错。
AtEndOfLine及AtEndOfStream的使用
Dim strPath,strText
strPath = "c:\test.txt"
Call ReadFile(strPath)
Sub ReadFile(Path)
Dim objFSO,objStream,stri
Set objFSO = CreateObject("Scripting.FileSystemobject")
'以只读的方式打开文件
Set objStream = objFSO.OpenTextFile(Path,1,True)
'如果当前的指针不在行末,则读取文本内容
Do While objStream.AtEndOfLine <> True
'如果当前指针不在文本末尾 'Do while objStream.AtEndOfStream <> true
stri = stri + objStream.Read(1)
Loop
MsgBox stri
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