三、利用FileSystemObject對(duì)象來處理文件
FileSystemObject對(duì)象模型,是微軟提供的專門用來訪問計(jì)算機(jī)文件系統(tǒng)的,具有大量的屬性、方法和事件。其使用面向?qū)ο蟮?#8220;object.method”語法來處理文件夾和文件,使用起來十分方便(需Office 2000以后版本)。FileSystemObject并不是VBA的一部分,它是以一個(gè)COM組件的形式提供的。因此,要使用先要?jiǎng)?chuàng)建FileSystemObject對(duì)象。
FileSystemObject對(duì)象模型包含了下面的對(duì)象和集合:
·FileSystemObject 主對(duì)象,包含用來創(chuàng)建、刪除和獲得有關(guān)信息,以及用來操作驅(qū)動(dòng)器、文件夾和文件的方法和屬性。
·Drive 對(duì)象,包含用來獲得信息的方法和屬性,這些信息是關(guān)于連接在系統(tǒng)上的驅(qū)動(dòng)器的,如有多少可用空間等。驅(qū)動(dòng)器不一定是硬盤,也可以是CD-ROM、U盤甚至是通過網(wǎng)絡(luò)在邏輯上連接的硬盤(如公司里部門共享的服務(wù)器網(wǎng)絡(luò)硬盤)。
·Drives 集合,提供驅(qū)動(dòng)器的列表,這些驅(qū)動(dòng)器以實(shí)物或在邏輯上與系統(tǒng)相連接。Drives集合包括所有驅(qū)動(dòng)器,與類型無關(guān)。
·File 對(duì)象,包含用來創(chuàng)建、刪除或移動(dòng)文件的方法和屬性。
·Files 集合,提供包含在文件夾內(nèi)的所有文件的列表。
·Folder 對(duì)象,包含用來創(chuàng)建、刪除或移動(dòng)文件夾的方法和屬性。
·Folders 集合,提供包含在文件夾內(nèi)的所有文件夾的列表。
·TextStream 對(duì)象,用來讀寫文本文件。
(一)準(zhǔn)備工作
要使用FileSystemObject對(duì)象,先要?jiǎng)?chuàng)建它。創(chuàng)建FileSystemObject對(duì)象要使用CreatObject函數(shù)。CreateObject 函數(shù)用來創(chuàng)建并返回一個(gè)對(duì) ActiveX 對(duì)象的引用。
語法:CreateObject(class,[servername])
class 是要?jiǎng)?chuàng)建的應(yīng)用程序名稱和類。
servername 要在其上創(chuàng)建對(duì)象的網(wǎng)絡(luò)服務(wù)器名稱。(如果要在遠(yuǎn)程計(jì)算機(jī)上創(chuàng)建對(duì)象才用)
class 參數(shù)使用 appname.objecttype 這種語法,包括以下部分:
appname 必需的;提供該對(duì)象的應(yīng)用程序名。
objecttype 必需的;待創(chuàng)建對(duì)象的類型或類。
因此,我們用下面的代碼創(chuàng)建FileSystemObject對(duì)象:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Scripting是類型庫的名稱,F(xiàn)ileSystemObject就是要?jiǎng)?chuàng)建的對(duì)象的名字。
同樣我們可以創(chuàng)建Dictionary 對(duì)象如下:
Dim d
Set d = CreateObject("Scripting.Dictionary")
(二)FileSystemObject對(duì)象的方法
FileSystemObject對(duì)象模型中有些功能是重復(fù)的,如可用FileSystemObject對(duì)象的CpoyFile方法,也可用File對(duì)象的Copy方法來復(fù)制文件。下面先介紹FileSystemObject對(duì)象的方法。
1、GetDrive 方法
語法:object.GetDrive drivespec
drivespec參數(shù)可以是一個(gè)驅(qū)動(dòng)器字符(c)、一個(gè)驅(qū)動(dòng)器字符加一個(gè)冒號(hào)(c:)、一個(gè)驅(qū)動(dòng)器字符加冒號(hào)和路徑分隔符(c:\)或任何網(wǎng)絡(luò)共享的說明(
\\computer2\share1)。
作用:返回一個(gè)與指定路徑中的驅(qū)動(dòng)器相對(duì)應(yīng)的 Drive 對(duì)象。
示例:
Dim d
Set d = fso.GetDrive("D:") '變量d就代表了驅(qū)動(dòng)器D對(duì)象
如果 drivespec 不符合任何一種可以接受的形式或者不存在,則發(fā)生一個(gè)錯(cuò)誤。
注意:為簡潔,示例中都假定fso是已經(jīng)創(chuàng)建的FileSystemObject對(duì)象
2、GetDriveName 方法
語法:object.GetDriveName(path)
作用:返回一個(gè)包含指定路徑的驅(qū)動(dòng)器名字的字符串。
示例:
Debug.Print fso.GetDriveName("c:\test.txt") '立即窗口顯示"c:"
3、GetExtensionName 方法
語法:object.GetExtensionName(path)
作用:返回一個(gè)包含路徑中最后部件擴(kuò)展名的字符串。
示例:
Debug.Print fso.GetExtensionName("c:\test.txt") '立即窗口顯示"txt"
4、GetBaseName 方法
語法:object.GetBaseName(path)
作用:返回一個(gè)包含路徑中最后部件的基本名字(去掉任何文件擴(kuò)展名)的字符串。
示例:
Debug.Print fso.GetBaseName("c:\abc\test.txt") '立即窗口顯示"test"
5、GetAbsolutePathName 方法
語法:object.GetAbsolutePathName(pathspec)
作用:從提供的路徑說明中返回一個(gè)完整、明確的路徑。
示例:
如果pathspec為空字符串"",則返回當(dāng)前路徑。假設(shè)當(dāng)前路徑為C:\Documents and Settings\yc\My Documents
Debug.Print fs.GetAbsolutePathName("") '顯示C:\Documents and Settings\yc\My Documents
Debug.Print fs.GetAbsolutePathName("c:..") '顯示C:\Documents and Settings\yc,即上層目錄
Debug.Print fs.GetAbsolutePathName("abc") '顯示C:\Documents and Settings\yc\My Documents\abc
Debug.Print fs.GetAbsolutePathName("c:\test.txt") '顯示C:\test.txt
6、GetFile 方法
語法:object.GetFile(filespec)
作用:返回一個(gè)和指定路徑中文件相對(duì)應(yīng)的 File 對(duì)象。
示例:
Dim f
Set f = fso.GetFile("c:\test.txt") '變量f就代表了文件test.txt對(duì)象
注意:如果指定的文件不存在,則發(fā)生一個(gè)錯(cuò)誤。
7、GetFileName 方法
語法:object.GetFileName(pathspec)
作用:返回指定路徑中的最后部件,該路徑不是驅(qū)動(dòng)器說明的一部分。
示例:
Debug.Print fso.GetFileName("c:\abc\test.txt") '立即窗口顯示"test.txt"
8、GetFolder 方法
語法:object.GetFolder(folderspec)
作用:返回一個(gè)和指定路徑中文件夾相對(duì)應(yīng)的 Folder 對(duì)象。
示例:
Dim fd
Set fd = fso.GetFolder("c:\windows") '變量f就代表了文件夾windows對(duì)象
注意:如果指定的文件夾不存在,則發(fā)生一個(gè)錯(cuò)誤。
9、GetSpecialFolder 方法
語法:object.GetSpecialFolder(folderspec)
作用:返回指定的特殊文件夾。
說明:
folderspec 參數(shù)可為任何的下列值:
WindowsFolder 0 Windows 文件夾,包含由 Windows 操作系統(tǒng)安裝的文件。
SystemFolder 1 系統(tǒng)文件夾,包含庫、字體、設(shè)備驅(qū)動(dòng)程序。
TemporaryFolder 2 Temp 文件夾,用于存儲(chǔ)臨時(shí)文件。它的路徑在 TMP 環(huán)境變量中。
10、GetParentFolderName 方法
語法:object.GetParentFolderName(path)
作用:返回一個(gè)包含指定路徑最后部件父文件夾名字的字符串。
示例:
Debug.Print fso.GetParentFolderName("c:\tmp\test.txt") '顯示"c:\tmp"
11、GetTempName 方法
語法:object.GetTempName
作用:返回一個(gè)隨機(jī)產(chǎn)生的臨時(shí)文件或文件夾的名字,該名字在執(zhí)行需要臨時(shí)文件或文件夾的操作時(shí)有用。
說明:GetTempName 方法不產(chǎn)生一個(gè)文件,它僅提供一個(gè)臨時(shí)文件名字,該名字可被 CreateTextFile 用于創(chuàng)建一個(gè)文件。
示例:
Debug.Print fso.GetTempName '顯示"radB0208.tmp",每次都會(huì)變。
12、BuildPath 方法
語法:object.BuildPath(path, name)
作用:追加一個(gè)名字到一個(gè)已經(jīng)存在的路徑。
示例:
Debug.Print fso.BuildPath("c:\tmp", "abc") '顯示"c:\tmp\abc"
13、CreateFolder 方法
語法:object.CreateFolder(foldername)
作用:創(chuàng)建一個(gè)文件夾。
注意:如果指定的文件夾已經(jīng)存在,則發(fā)生一個(gè)錯(cuò)誤。
示例:
fso.CreateFolder("c:\myfolder") '在C盤創(chuàng)建一個(gè)myfolder文件夾
14、CopyFolder 方法
語法:object.CopyFolder source, destination[, overwrite]
source 必需的。指明一個(gè)或多個(gè)被復(fù)制文件夾的字符串文件夾說明,可以包括通配符。
destination 必需的。指明 source 中被復(fù)制文件夾和子文件夾的接受端的字符串,不允許有通配符。
overwrite 可選的。Boolean 值,它表示已存在的文件夾是否被覆蓋。如果為 True,文件被覆蓋。如果為 False,文件不被覆蓋。缺省值為 True。
作用:復(fù)制一個(gè)文件夾到另一個(gè)地方。
說明:
① 通配符僅可用于 source 參數(shù)的最后一個(gè)路徑部件。
例如:fso.CopyFolder "c:\mydocuments\letters\*", "c:\tempfolder\" 這是可以的。
但不能這樣:fso.CopyFolder "c:\mydocuments\*\*", "c:\tempfolder\"
② 如果 source 包含通配符或 destination 以路徑分隔符(\)為結(jié)尾,則認(rèn)為 destination 是一個(gè)已存在的文件夾,在其中復(fù)制相匹配的文件夾和子文件夾。否則認(rèn)為 destination 是一個(gè)要?jiǎng)?chuàng)建的文件夾的名字。
例如:fso.copyfolder "c:\tmp", "f:\abc\"
如果F盤沒有abc文件夾,將發(fā)生錯(cuò)誤。如果存在,可看到abc文件夾里有tmp文件夾。
假如寫成這樣:fso.copyfolder "c:\tmp", "f:\abc"
此時(shí)若abc不存在,將創(chuàng)建abc文件夾,且將tmp文件夾里的內(nèi)容復(fù)制到abc文件夾里,而不是tmp文件夾,只有abc是一個(gè)已經(jīng)存在的文件夾時(shí),才復(fù)制整個(gè)tmp文件夾到abc文件夾里。
③如果 destination 是一個(gè)已存在的文件,則發(fā)生一個(gè)錯(cuò)誤。
④如果 destination 是一個(gè)目錄,它將嘗試復(fù)制文件夾和它所有的內(nèi)容。如果一個(gè)包含在 source 的文件已在 destination 中存在,當(dāng) overwrite 為 False 時(shí)發(fā)生一個(gè)錯(cuò)誤,否則它將嘗試覆蓋這個(gè)文件。
⑤如果 destination 是一個(gè)只讀目錄,當(dāng)嘗試去復(fù)制一個(gè)已存在的只讀文件到此目錄并且 overwrite為 False 時(shí),則發(fā)生一個(gè)錯(cuò)誤。
⑥如果 source 不存在或使用的通配符不能和任何文件夾匹配,也發(fā)生一個(gè)錯(cuò)誤。
⑦CopyFolder 方法停止在它遇到的第一個(gè)錯(cuò)誤上,之前所做的操作是不會(huì)消失的,所以要注意。
15、MoveFolder 方法
語法:object.MoveFolder source, destination
參數(shù)與CopyFolder的前兩個(gè)一樣。
作用:將一個(gè)或多個(gè)文件夾從一個(gè)地方移動(dòng)到另一個(gè)地方。
說明:
①只有在操作系統(tǒng)支持的情況下,這個(gè)方法才允許文件夾在卷之間移動(dòng)。Windows是不允許的,將C盤的文件夾移到D盤是不行的。
②如果 source 包含通配符或 destination 以路徑分隔符 (\) 為結(jié)尾,則認(rèn)為 destination 指定了一個(gè)已存在的文件夾,在此文件夾中移動(dòng)相匹配的文件。否則,認(rèn)為 destination 是一個(gè)要?jiǎng)?chuàng)建的目標(biāo)文件夾名字。這點(diǎn)與CopyFolder是一樣的。
③如果 destination 是一個(gè)已存在的文件,則發(fā)生一個(gè)錯(cuò)誤。
④如果 destination 是一個(gè)目錄,則發(fā)生一個(gè)錯(cuò)誤。
例如:
fso.movefolder "c:\tmp", "c:" '發(fā)生錯(cuò)誤。
⑤如果 source 不存在或使用的通配符不能和任何文件夾匹配,也發(fā)生一個(gè)錯(cuò)誤。
⑥MoveFolder 方法停止在它遇到的第一個(gè)錯(cuò)誤上。不要嘗試回卷在錯(cuò)誤發(fā)生前所做的任何改變。
16、DeleteFolder 方法
語法:object.DeleteFolder folderspec[, force]
folderspec 必需的。要?jiǎng)h除的文件夾的名字。 Folderspec 可以在最后的路徑部件中包含通配符。
force 可選的。Boolean 值,如果要?jiǎng)h除具有只讀屬性設(shè)置的文件夾,其值為 True,如果值為 False (缺?。?,則不能刪除具有只讀屬性設(shè)置的文件夾。
作用:刪除一個(gè)指定的文件夾和它的內(nèi)容。
說明:如果沒有發(fā)現(xiàn)相匹配的文件夾,則發(fā)生一個(gè)錯(cuò)誤。DeleteFolder 方法停止在它遇到的第一個(gè)錯(cuò)誤上,不要嘗試回卷或撤消錯(cuò)誤發(fā)生前所做的任何改變。
示例:
fso.DeleteFolder("c:\tmp")
17、FolderExists 方法
語法:object.FolderExists(folderspec)
作用:如果指定的文件夾存在返回 True,不存在返回 False。
18、DriveExists 方法
語法:object.DriveExists(drivespec)
作用:如果指定的驅(qū)動(dòng)器存在,返回 True,如果不存在返回 False。
19、FileExists 方法
語法:object.FileExists(filespec)
作用:如果指定的文件存在,返回 True,若不存在,則返回 False。
20、CreateTextFile 方法
語法:object.CreateTextFile(filename[, overwrite[, unicode]])
overwrite 可選的。Boolean 值,表示一個(gè)已存在文件是否可被覆蓋。如果可被覆蓋其值為 True,其值為 False 時(shí)不能覆蓋。如果它被省略,則已存在文件不能覆蓋。
unicode 可選的。Boolean 值,表示文件是作為一個(gè) Unicode 文件創(chuàng)建的還是作為一個(gè)ASCII 文件創(chuàng)建的。如果作為一個(gè) Unicode 文件創(chuàng)建,其值為 True,作為一個(gè) ASCII 文件創(chuàng)建,其值為 False。如果省略的話,則認(rèn)為是一個(gè) ASCII 文件。
作用:創(chuàng)建一個(gè)指定的文件名并且返回一個(gè)用于該文件讀寫的 TextStream 對(duì)象。
示例:
Dim f
Set f = fso.CreateTextFile("c:\testfile.txt", True)
21、OpenTextFile 方法
語法:object.OpenTextFile(filename[, iomode[, create[, format]]])
作用:打開一個(gè)指定的文件并返回一個(gè) TextStream 對(duì)象,該對(duì)象可用于對(duì)文件進(jìn)行讀、寫、追加操作。
說明:
·iomode 參數(shù)可為下面設(shè)置值中的任何值:
ForReading 1 打開一個(gè)只讀文件,不能對(duì)此文件進(jìn)行寫操作。
ForWriting 2 打開一個(gè)用于寫操作的文件。如果和此文件同名的文件已存在,則覆蓋以前內(nèi)容。
ForAppending 8 打開一個(gè)文件并寫到文件的尾部。
注意:在VBA幫助里是沒有ForWriting的,其實(shí)是有的,VBA幫助也是有錯(cuò)誤的。另外,這些常數(shù)在使用前要先聲明,或者直接用數(shù)值。
·create 可選的,它表示如果指定的 filename 不存在是否可以創(chuàng)建一個(gè)新文件。如果創(chuàng)建新文件,其值為 True。若不創(chuàng)建文件其值為 False。缺省值為 False。
·Format 參數(shù)可為下面設(shè)置值中的任何值:
TristateUseDefault –2 使用系統(tǒng)缺省打開文件。
TristateTrue –1 以 Unicode 格式打開文件。
TristateFalse 0 以 ASCII 格式打開文件。
示例:
Dim f
Set f = fso.OpenTextFile("c:\testfile.txt", 2, True)
或者:
Const ForWriting = 2
Set f = fso.OpenTextFile("c:\testfile.txt", ForWriting, True)
這兩者功能是一樣的,一個(gè)聲明了常量,一個(gè)直接用數(shù)值。都是在C盤創(chuàng)建文件testfile.txt(如不存在),或以寫的方式打開(如存在)。
22、CopyFile 方法
語法:object.CopyFile source, destination[, overwrite]
作用:把一個(gè)或多個(gè)文件從一個(gè)地方復(fù)制到另一個(gè)地方。
說明:需要注意的地方與CopyFolder是完全類似的。
示例:
fso.copyfile "c:\testfile.txt", "f:\abc\" '若abc不存在則出錯(cuò)。
fso.copyfile "c:\testfile.txt", "f:\abc" '若abc不存在則復(fù)制testfile.txt到F盤文件名變?yōu)閍bc,若abc存在,出錯(cuò),因?yàn)槭且粋€(gè)目錄。
23、MoveFile 方法
語法:object.MoveFile source, destination
作用:將一個(gè)或多個(gè)文件從一個(gè)地方移動(dòng)到另一個(gè)地方。
說明:需要注意的地方與MoveFolder是完全類似的。