首頁>技術>

三、利用FileSystemObject物件來處理檔案

FileSystemObject物件模型,是微軟提供的專門用來訪問計算機檔案系統的,具有大量的屬性、方法和事件。其使用面向物件的“object.method”語法來處理資料夾和檔案,使用起來十分方便(需Office 2000以後版本)。FileSystemObject並不是VBA的一部分,它是以一個COM元件的形式提供的。因此,要使用先要建立FileSystemObject物件。

FileSystemObject物件模型包含了下面的物件和集合:

•Drive 物件,包含用來獲得資訊的方法和屬性,這些資訊是關於連線在系統上的驅動器的,如有多少可用空間等。驅動器不一定是硬碟,也可以是CD-ROM、隨身碟甚至是透過網路在邏輯上連線的硬碟(如公司裡部門共享的伺服器網路硬碟)。

•Drives 集合,提供驅動器的列表,這些驅動器以實物或在邏輯上與系統相連線。Drives集合包括所有驅動器,與型別無關。

•Files 集合,提供包含在資料夾內的所有檔案的列表。

•Folders 集合,提供包含在資料夾內的所有資料夾的列表。

•TextStream 物件,用來讀寫文字檔案。

(一)準備工作

要使用FileSystemObject物件,先要建立它。建立FileSystemObject物件要使用CreatObject函式。CreateObject 函式用來建立並返回一個對 ActiveX 物件的引用。

語法:CreateObject(class,[servername])

class 是要建立的應用程式名稱和類。

servername 要在其上建立物件的網路伺服器名稱。(如果要在遠端計算機上建立物件才用)

class 引數使用 appname.objecttype 這種語法,包括以下部分:

appname 必需的;提供該物件的應用程式名。

objecttype 必需的;待建立物件的型別或類。

因此,我們用下面的程式碼建立FileSystemObject物件:

Dim fso As Object

Set fso = CreateObject("Scripting.FileSystemObject")

Scripting是型別庫的名稱,FileSystemObject就是要建立的物件的名字。

同樣我們可以建立Dictionary 物件如下:

Dim d

Set d = CreateObject("Scripting.Dictionary")

(二)FileSystemObject物件的方法

FileSystemObject物件模型中有些功能是重複的,如可用FileSystemObject物件的CpoyFile方法,也可用File物件的Copy方法來複制檔案。下面先介紹FileSystemObject物件的方法。

1、GetDrive 方法

語法:object.GetDrive drivespec

drivespec引數可以是一個驅動器字元(c)、一個驅動器字元加一個冒號(c:)、一個驅動器字元加冒號和路徑分隔符(c:\)或任何網路共享的說明(\\computer2\share1)。

作用:返回一個與指定路徑中的驅動器相對應的 Drive 物件。

示例:

Dim d

Set d = fso.GetDrive("D:") '變數d就代表了驅動器D物件

如果 drivespec 不符合任何一種可以接受的形式或者不存在,則發生一個錯誤。

注意:為簡潔,示例中都假定fso是已經建立的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物件

注意:如果指定的檔案不存在,則發生一個錯誤。

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物件

注意:如果指定的資料夾不存在,則發生一個錯誤。

9、GetSpecialFolder 方法

語法:object.GetSpecialFolder(folderspec)

作用:返回指定的特殊資料夾。

說明:

folderspec 引數可為任何的下列值:

WindowsFolder 0 Windows 資料夾,包含由 Windows 作業系統安裝的檔案。

SystemFolder 1 系統資料夾,包含庫、字型、裝置驅動程式。

TemporaryFolder 2 Temp 資料夾,用於儲存臨時檔案。它的路徑在 TMP 環境變數中。

10、GetParentFolderName 方法

語法:object.GetParentFolderName(path)

作用:返回一個包含指定路徑最後部件父資料夾名字的字串。

示例:

Debug.Print fso.GetParentFolderName("c:\tmp\test.txt") '顯示"c:\tmp"

11、GetTempName 方法

語法:object.GetTempName

作用:返回一個隨機產生的臨時檔案或資料夾的名字,該名字在執行需要臨時檔案或資料夾的操作時有用。

說明:GetTempName 方法不產生一個檔案,它僅提供一個臨時檔名字,該名字可被 CreateTextFile 用於建立一個檔案。

示例:

Debug.Print fso.GetTempName '顯示"radB0208.tmp",每次都會變。

12、BuildPath 方法

語法:object.BuildPath(path, name)

作用:追加一個名字到一個已經存在的路徑。

示例:

Debug.Print fso.BuildPath("c:\tmp", "abc") '顯示"c:\tmp\abc"

13、CreateFolder 方法

語法:object.CreateFolder(foldername)

作用:建立一個資料夾。

注意:如果指定的資料夾已經存在,則發生一個錯誤。

示例:

fso.CreateFolder("c:\myfolder") '在C盤建立一個myfolder資料夾

14、CopyFolder 方法

語法:object.CopyFolder source, destination[, overwrite]

source 必需的。指明一個或多個被複制資料夾的字串資料夾說明,可以包括萬用字元。

destination 必需的。指明 source 中被複制資料夾和子資料夾的接受端的字串,不允許有萬用字元。

overwrite 可選的。Boolean 值,它表示已存在的資料夾是否被覆蓋。如果為 True,檔案被覆蓋。如果為 False,檔案不被覆蓋。預設值為 True。

作用:複製一個資料夾到另一個地方。

說明:

① 萬用字元僅可用於 source 引數的最後一個路徑部件。

例如:fso.CopyFolder "c:\mydocuments\letters\*", "c:\tempfolder\" 這是可以的。

但不能這樣:fso.CopyFolder "c:\mydocuments\*\*", "c:\tempfolder\"

② 如果 source 包含萬用字元或 destination 以路徑分隔符(\)為結尾,則認為 destination 是一個已存在的資料夾,在其中複製相匹配的資料夾和子資料夾。否則認為 destination 是一個要建立的資料夾的名字。

例如:fso.copyfolder "c:\tmp", "f:\abc\"

如果F盤沒有abc資料夾,將發生錯誤。如果存在,可看到abc資料夾裡有tmp資料夾。

假如寫成這樣:fso.copyfolder "c:\tmp", "f:\abc"

此時若abc不存在,將建立abc資料夾,且將tmp資料夾裡的內容複製到abc資料夾裡,而不是tmp資料夾,只有abc是一個已經存在的資料夾時,才複製整個tmp資料夾到abc資料夾裡。

④如果 destination 是一個目錄,它將嘗試複製資料夾和它所有的內容。如果一個包含在 source 的檔案已在 destination 中存在,當 overwrite 為 False 時發生一個錯誤,否則它將嘗試覆蓋這個檔案。

⑤如果 destination 是一個只讀目錄,當嘗試去複製一個已存在的只讀檔案到此目錄並且 overwrite為 False 時,則發生一個錯誤。

⑥如果 source 不存在或使用的萬用字元不能和任何資料夾匹配,也發生一個錯誤。

⑦CopyFolder 方法停止在它遇到的第一個錯誤上,之前所做的操作是不會消失的,所以要注意。

15、MoveFolder 方法

語法:object.MoveFolder source, destination

引數與CopyFolder的前兩個一樣。

作用:將一個或多個資料夾從一個地方移動到另一個地方。

說明:

①只有在作業系統支援的情況下,這個方法才允許資料夾在卷之間移動。Windows是不允許的,將C盤的資料夾移到D盤是不行的。

②如果 source 包含萬用字元或 destination 以路徑分隔符 (\) 為結尾,則認為 destination 指定了一個已存在的資料夾,在此資料夾中移動相匹配的檔案。否則,認為 destination 是一個要建立的目標資料夾名字。這點與CopyFolder是一樣的。

④如果 destination 是一個目錄,則發生一個錯誤。

例如:

fso.movefolder "c:\tmp", "c:" '發生錯誤。

⑤如果 source 不存在或使用的萬用字元不能和任何資料夾匹配,也發生一個錯誤。

⑥MoveFolder 方法停止在它遇到的第一個錯誤上。不要嘗試回捲在錯誤發生前所做的任何改變。

16、DeleteFolder 方法

語法:object.DeleteFolder folderspec[, force]

說明:如果沒有發現相匹配的資料夾,則發生一個錯誤。DeleteFolder 方法停止在它遇到的第一個錯誤上,不要嘗試回捲或撤消錯誤發生前所做的任何改變。

示例:

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 檔案建立的還是作為一個ASCII 檔案建立的。如果作為一個 Unicode 檔案建立,其值為 True,作為一個 ASCII 檔案建立,其值為 False。如果省略的話,則認為是一個 ASCII 檔案。

作用:建立一個指定的檔名並且返回一個用於該檔案讀寫的 TextStream 物件。

示例:

Dim f

Set f = fso.CreateTextFile("c:\testfile.txt", True)

21、OpenTextFile 方法

語法:object.OpenTextFile(filename[, iomode[, create[, format]]])

作用:開啟一個指定的檔案並返回一個 TextStream 物件,該物件可用於對檔案進行讀、寫、追加操作。

說明:

•iomode 引數可為下面設定值中的任何值:

ForReading 1 開啟一個只讀檔案,不能對此檔案進行寫操作。

ForWriting 2 開啟一個用於寫操作的檔案。如果和此檔案同名的檔案已存在,則覆蓋以前內容。

ForAppending 8 開啟一個檔案並寫到檔案的尾部。

注意:在VBA幫助裡是沒有ForWriting的,其實是有的,VBA幫助也是有錯誤的。另外,這些常數在使用前要先宣告,或者直接用數值。

•create 可選的,它表示如果指定的 filename 不存在是否可以建立一個新檔案。如果建立新檔案,其值為 True。若不建立檔案其值為 False。預設值為 False。

•Format 引數可為下面設定值中的任何值:

TristateUseDefault –2 使用系統預設開啟檔案。

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)

這兩者功能是一樣的,一個聲明瞭常量,一個直接用數值。都是在C盤建立檔案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盤檔名變為abc,若abc存在,出錯,因為是一個目錄。

23、MoveFile 方法

語法:object.MoveFile source, destination

作用:將一個或多個檔案從一個地方移動到另一個地方。

說明:需要注意的地方與MoveFolder是完全類似的。

24、DeleteFile 方法

語法:object.DeleteFile filespec[, force]

(三)處理驅動器

可以利用Drive物件來獲取有關各種驅動器的資訊,Drive物件的屬性有:

TotalSize 屬性 驅動器的總容量,以位元組為單位。

AvailableSpace 屬性 驅動器的可用空間容量,以位元組為單位。

FreeSpace 屬性 驅動器的剩餘空間容量,和 AvailableSpace 屬性是相同的。

對於支援限額的計算機系統來說,二者之間可能有所不同。

DriveLetter 屬性 驅動器字母,即碟符。

DriveType 屬性 驅動器的型別。如"Removable"、"Fixed"、"Network"、"CD-ROM"、"RAM Disk"

SerialNumber 屬性 驅動器的序列號。

FileSystem 屬性 驅動器所使用的檔案系統型別。如FAT、FAT32、NTFS、以及 CDFS。

IsReady 屬性 驅動器是否可用。

ShareName 屬性 驅動器的網路共享名。

VolumeName 屬性 驅動器的卷標名。

Path 屬性 驅動器的路徑。C 驅動器的路徑是 C:,而不是 C:\。

RootFolder 屬性 定驅動器的根資料夾。C 驅動器的根資料夾是 C:\。

這些屬性的使用都十分簡單,直接用“物件.屬性”就可以了。在使用前要先用GetDrive獲得一個Drive物件,注意不能建立一個驅動器物件。下面舉個例子:

Sub ShowFreeSpace(drvPath)

Dim fs, d, s

Set fs = CreateObject("Scripting.FileSystemObject")

Set d = fs.Getdrive(fs.GetDriveName(drvPath))

s = "Drive " & UCase(drvPath) & "-"

s = s & d.VolumeName & vbCrLf

s = s & "Free Space: " & FormatNumber(d.FreeSpace / 1024, 0)

s = s & " Kbytes"

MsgBox s

End Sub

利用Call ShowFreeSpace("c:"),即可獲得C盤的卷標名和可用空間。

(四)處理資料夾

1、獲取資料夾的資訊

可以利用Folder物件來獲取有關資料夾的資訊,Folder物件的屬性有:

Attributes 屬性 資料夾的屬性。可為下列值中的任意一個或任意的邏輯組合:

Normal 0 一般檔案。未設定屬性。

ReadOnly 1 只讀檔案。屬性為讀/寫。

Hidden 2 隱藏檔案。屬性為讀/寫。

System 4 系統檔案。屬性為讀/寫。

Volume 8 磁碟驅動器卷標。屬性為只讀。

Directory 16 資料夾或目錄。屬性為只讀。

Archive 32 自上次備份後已經改變的檔案。屬性為讀/寫。

Alias 64 連結或快捷方式。屬性為只讀。

Compressed 128 壓縮檔案。屬性為只讀。

Name 屬性 資料夾名字。

ShortName 屬性 較早的 8.3 命名約定的程式所使用的短名字。

Type 屬性 資料夾型別。

Files 屬性 所有 File 物件組成的 Files 集合,這些 File 物件包含在指定的資料夾中

──包括設定了隱藏和系統檔案屬性的那些檔案。

Drive 屬性 資料夾所在的驅動器符號。

IsRootFolder 屬性 資料夾是否是根資料夾。

ParentFolder 屬性 資料夾的父資料夾物件。

SubFolders 屬性 資料夾的子資料夾集合。

Path 屬性 資料夾的路徑。

ShortPath 屬性 較早的 8.3 檔案命名約定的程式所使用的短路徑。

Size 屬性 資料夾的大小,以位元組為單位。

DateCreated 屬性 資料夾的建立日期和時間。

DateLastModified 屬性 最後一次修改資料夾的日期和時間。

DateLastAccessed 屬性 最後一次訪問資料夾的日期和時間。

屬性的使用和Drive物件是一樣的,可以用GetFolder獲取一個Folder物件,也可以用FileSystemObject物件的CreateFolder 方法建立一個Folder物件。

2、Folder物件的方法

⑴Copy 方法

語法:object.Copy destination[, overwrite]

作用:把一個指定的資料夾從一個地方複製到另一個地方。

說明:Copy 方法的作用與FileSystemObject物件的CopyFolder 方法是一樣的,不同在於後者可一次複製多個資料夾。

⑵Move 方法

語法:object.Move destination

作用:將一個指定的資料夾從一個地方移動到另一個地方。

說明:Move 方法的作用與FileSystemObject.MoveFolder 是一樣的。不同在於後者可一次移動多個資料夾。

⑶Delete 方法

語法:object.Delete force

說明:Delete 方法的作用與FileSystemObject.DeleteFolder 是一樣的。

⑷CreateTextFile 方法

語法:object.CreateTextFile(filename[, overwrite[, unicode]])

作用:與FileSystemObject物件的CreateTextFile 方法是一樣的。

示例:

Set fd = fs.getfolder("c:\tmp")

Set f = fd.CreateTextFile("testfile.txt", True)

可在C盤tmp資料夾下建立testfile.txt檔案。

(五)處理檔案

1、獲取檔案的資訊

可以利用File物件來獲取有關檔案的資訊,File物件的屬性和Folder的屬性是完全一樣的,只是少了Files 屬性、IsRootFolder 屬性、SubFolders 屬性這3個屬性。這裡就不列了。

2、File物件的方法

⑴Copy 方法

⑵Move 方法

⑶Delete 方法

以上三種方法與Folder的是完全類似的,語法也一樣,同樣也可用FileSystemObject物件相應的方法代替。

⑷OpenAsTextStream 方法

語法:object.OpenAsTextStream([iomode, [format]])

作用:開啟一個指定的檔案並返回一個 TextStream 物件,該物件可用來對檔案進行讀、寫、追加操作。

說明:此方法與FileSystemObject物件的 OpenTextFile 方法相同的功能。引數也是一致的。

(六)處理文字檔案

1、開啟或建立文字檔案

開啟現有的文字檔案,可以使用FileSystemObject物件的 OpenTextFile 方法或File物件的OpenAsTextStream 方法。

建立檔案可以使用FileSystemObject物件的 CreatTextFile 方法或在OpenTextFile 方法中將iomode引數設為ForWriting=2,create引數設為True。

例如:

Set f = fso.OpenTextFile("c:\test1.xls", 2, True) '如果不存在test1.xls將自動建立。

2、讀取檔案

開啟檔案後,將返回一個TextStream 物件,我們可以利用TextStream 物件的屬性及方法來對檔案進行讀寫操作。

先看TextStream 物件的幾個屬性。

•AtEndOfLine 屬性 檔案指標是否正好在行尾標記的前面

•AtEndOfStream 屬性 檔案指標是否在 TextStream 檔案末尾

•Column 屬性 TextStream 檔案中當前字元位置的列號

•Line 屬性 TextStream 檔案中的當前行號

利用TextStream 物件讀取檔案有三種方法。

•Read 方法

語法:object.Read(characters)

功能:從一個 TextStream 檔案中讀取指定數量的字元並返回得到的字串。

示例:

Sub du()

Dim fso, a, retstring

Const ForReading = 1

Set fso = CreateObject("Scripting.FileSystemObject")

Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)

Do While a.AtEndOfLine <> True '是否到行末

retstring = retstring & a.Read(1) '讀取一個字元

Loop

a.Close

Debug.Print retstring '可看到讀取了第一行的字元

End Sub

•ReadLine 方法

語法:object.ReadLine

功能:從一個 TextStream 檔案讀取一整行(到換行符但不包括換行符)並返回得到的字串。

示例:

Sub du_line()

Dim fso, a, retstring

Const ForReading = 1

Set fso = CreateObject("Scripting.FileSystemObject")

Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)

Do While a.AtEndOfStream <> True '是否在 TextStream 檔案末尾

retstring = a.ReadLine '讀取一行

Debug.Print retstring '顯示在立即視窗

Loop

a.Close

End Sub

•ReadAll 方法

語法:object.ReadAll

功能:讀取整個的 TextStream 檔案並返回得到的字串。

說明:對於大的檔案,使用ReadAll方法浪費記憶體資源。應使用其它的技術去輸入一個檔案,比如按行讀取檔案。

示例:

Sub du_all()

Dim fso, a, retstring

Const ForReading = 1

Set fso = CreateObject("Scripting.FileSystemObject")

Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)

retstring = a.Readall '全部讀取

Debug.Print retstring

a.Close

End Sub

還有兩個輔助讀取的方法:

•Skip 方法

語法:object.Skip(characters)

功能:當讀一個 TextStream 檔案時跳過指定數量的字元。

示例:

Sub duskip()

Dim fso, a, retstring

Const ForReading = 1

Set fso = CreateObject("Scripting.FileSystemObject")

Set a = fso.OpenTextFile("c:\testfile.txt", ForReading, False)

Do While a.AtEndOfLine <> True '是否到行末

retstring = retstring & a.Read(1) '讀取一個字元

a.Skip (1) '跳過一個字元

Loop

a.Close

Debug.Print retstring '可看到讀取了第一行的奇數位的字元

End Sub

•SkipLine 方法

語法:object.SkipLine

功能:當讀一個 TextStream 檔案時跳過下一行。

3、寫入資料到檔案

寫入資料到檔案也有三種方法。

•Write 方法

語法:object.Write(string)

功能:寫一個指定的字串到一個 TextStream 檔案。

示例:

Sub xie()

Const ForWriting = 2, ForAppending = 8

Dim fs, f

Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.OpenTextFile("c:\testfile.txt", ForAppending,TristateFalse)

f.Write "Hello world!" '寫入字串

f.Close

End Sub

•WriteLine 方法

語法:object.WriteLine([string])

功能:寫入一個指定的字串和換行符到一個 TextStream 檔案中。

示例:

f.WriteLine("Hello world!") '寫入字串,加一個換行符。

•WriteBlankLines 方法

語法:object.WriteBlankLines(lines)

功能:寫入指定數量的換行符到一個 TextStream 檔案中。

示例:

f.WriteBlankLines(3) '相當於按3次回車。

4、關閉檔案

利用TextStream 物件的Close方法,上面的示例中已經有了,很簡單。

18
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • SpringCloud2020替換Netflix套件實踐四