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