從 Visual Basic 的第一版至今,VB中有關(guān)文件的處理都是通過(guò)使用 Open 、Write以及其它一些相關(guān)的語(yǔ)句和函數(shù)來(lái)實(shí)現(xiàn)的。隨著軟件技術(shù)的不斷發(fā)展,加上面向?qū)ο缶幊谈拍畹娜照槌墒?,這些文件操作語(yǔ)句已經(jīng)不能適應(yīng)軟件不斷增加的復(fù)雜程度的需要了。因此,從VB6.0開(kāi)始,微軟提出了一個(gè)全新的文件系統(tǒng)對(duì)象FSO。
一、簡(jiǎn)介
文件系統(tǒng)對(duì)象FSO的英文全稱是File System Object ,這種對(duì)象模型提出了有別于傳統(tǒng)的文件操作語(yǔ)句處理文件和文件夾的方法。通過(guò)采用object.method這種在面向?qū)ο缶幊讨袕V泛使用的語(yǔ)法,將一系列操作文件和文件夾的動(dòng)作通過(guò)調(diào)用對(duì)象本身的屬性直接實(shí)現(xiàn)。
FSO 對(duì)象模型不僅可以象使用傳統(tǒng)文件操作語(yǔ)句那樣實(shí)現(xiàn)文件的創(chuàng)建、改變、移動(dòng)和刪除,而且可以檢測(cè)是否存在指定的文件夾,如果存在,那么,這個(gè)文件夾又位于磁盤上的什么位置。更令人高興的是FSO 對(duì)象模型還可以獲取關(guān)于文件和文件夾的信息,如名稱、創(chuàng)建日期或最近修改日期等以及當(dāng)前系統(tǒng)中使用的驅(qū)動(dòng)器的信息,如驅(qū)動(dòng)器的種類是CD-ROM還是可移動(dòng)磁盤,當(dāng)前磁盤的剩余空間還有多少。而以前要獲取這些信息必須通過(guò)調(diào)用Windows API函數(shù)集中的相應(yīng)函數(shù)才能實(shí)現(xiàn)。
FSO對(duì)象模型包含在Scripting 類型庫(kù) (Scrrun.Dll)中,它同時(shí)包含了Drive、Folder、File、FileSystemObject和TextStream五個(gè)對(duì)象。其中Drive用來(lái)收集驅(qū)動(dòng)器的信息,如可用磁盤空間或驅(qū)動(dòng)器的類型;Folder用于創(chuàng)建、刪除或移動(dòng)文件夾,同時(shí)可以進(jìn)行向系統(tǒng)查詢文件夾的路徑等操作;File的基本操作和Folder基本相同,所不同的是Files的操作主要是針對(duì)磁盤上的文件進(jìn)行的;FileSystemObject是FSO對(duì)象模型中最主要對(duì)象,它提供了一套完整的可用于創(chuàng)建、刪除文件和文件夾,收集驅(qū)動(dòng)器、文件夾、文件相關(guān)信息的方法。需要注意的是,F(xiàn)SO對(duì)象模型提供的方法是冗余的,也就是說(shuō)在實(shí)際使用中,F(xiàn)SO對(duì)象模型中包含的不同對(duì)象的不同方法進(jìn)行的卻是同樣的操作,而且FileSystemObject對(duì)象的方法直接作用于其余對(duì)象,所以在后面的文章中并沒(méi)有單獨(dú)提到FileSystemObject對(duì)象,千萬(wàn)不要以為沒(méi)有提到就不重要,事實(shí)上FileSystemObject對(duì)象在整個(gè)FSO對(duì)象模型中無(wú)處不在;最后的TextStream對(duì)象則是用來(lái)完成對(duì)文件的讀寫(xiě)操作的。
在初步了解了FSO對(duì)象模型之后,下面我們通過(guò)實(shí)際的代碼對(duì)不同的對(duì)象進(jìn)行進(jìn)一步的闡述。
二、FSO對(duì)象模型的應(yīng)用
(一)創(chuàng)建FSO對(duì)象模型
由于FSO對(duì)象包含在Scripting 類型庫(kù) (Scrrun.Dll)中,所以在使用前首先需要在在工程中引用這個(gè)文件,單擊“工程”,“引用”,然后在“引用”對(duì)話框中選中“Microsoft Scripting Runtime”前的復(fù)選框,然后單擊“確定”。
要?jiǎng)?chuàng)建FSO對(duì)象可以采用兩種方法,一種是將一個(gè)變量聲明為FSO對(duì)象類型:
Dim fsoTest As New FileSystemObject;
另一種是通過(guò)CreateObject方法創(chuàng)建一個(gè)FSO 對(duì)象:
Set fsoTest = CreateObject(“Scripting.FileSystemObject");
在實(shí)際使用中具體采用哪種聲明方法,可根據(jù)個(gè)人的使用習(xí)慣而定。
完成了FSO對(duì)象模型的創(chuàng)建之后,就可以利用創(chuàng)建的對(duì)象模型的方法訪問(wèn)下屬各個(gè)對(duì)象的屬性來(lái)獲取所需信息或進(jìn)行相關(guān)操作了,具體的方法在下面結(jié)合各個(gè)對(duì)象分別講述。
(二)Drive對(duì)象
上面已經(jīng)提到Drive對(duì)象是用來(lái)獲取當(dāng)前系統(tǒng)中各個(gè)驅(qū)動(dòng)器的信息的。由于Drive對(duì)象沒(méi)有方法,其應(yīng)用都是通過(guò)屬性表現(xiàn)出來(lái)的,所以我們必須熟悉Drive對(duì)象的屬性:
屬性功能
AvailableSpace返回在指定的驅(qū)動(dòng)器或網(wǎng)絡(luò)共享上的用戶可用的空間容量。
DriveLetter返回某個(gè)指定本地驅(qū)動(dòng)器或網(wǎng)絡(luò)驅(qū)動(dòng)器的字母,這個(gè)屬性是只讀的。
DriveType返回指定驅(qū)動(dòng)器的磁盤類型。
FileSystem返回指定驅(qū)動(dòng)器使用的文件系統(tǒng)類型。
FreeSpace返回指定驅(qū)動(dòng)器上或共享驅(qū)動(dòng)器可用的磁盤空間,這個(gè)屬性是只讀的。
IsReady確定指定的驅(qū)動(dòng)器是否準(zhǔn)備好。
Path 返回指定文件、文件夾、或驅(qū)動(dòng)器的路徑。
RootFolder返回一個(gè) Folder 對(duì)象,該對(duì)象表示一個(gè)指定驅(qū)動(dòng)器的根文件夾。只讀屬性。
SerialNumber返回用于唯一標(biāo)識(shí)磁盤卷標(biāo)的十進(jìn)制序列號(hào)。
ShareName返回指定驅(qū)動(dòng)器的網(wǎng)絡(luò)共享名
TotalSize以字節(jié)為單位,返回驅(qū)動(dòng)器或網(wǎng)絡(luò)共享的總空間大小。
VolumeName設(shè)置或返回指定驅(qū)動(dòng)器的卷標(biāo)名。
從上面的屬性可以看到Drive對(duì)象基本上包含了日常操作所需的全部的驅(qū)動(dòng)器信息,因此在使用中是非常方便的。下面通過(guò)一個(gè)實(shí)例講述Drive對(duì)象的使用。首先在VB中建立一個(gè)工程,然后添加一個(gè)命令按鈕,將其Caption設(shè)置為“TestDrive”,然后在click事件中加入以下代碼:
Dim fsoTest As New FileSystemObject
Dim drv1 As Drive, sReturn As String
Set drv1 = fsoTest.GetDrive(“C:\")
sReturn = “Drive " & “C:\" & vbCrLf
sReturn = sReturn & “VolumeName" & drv1.VolumeName & vbCrLf
sReturn = sReturn & “Total Space: " & FormatNumber(drv1.TotalSize / 1024, 0)
sReturn = sReturn & “Kb" & vbCrLf
sReturn = sReturn & “Free Space: " & FormatNumber(drv1.FreeSpace / 1024, 0)
sReturn = sReturn &“Kb" & vbCrLf
sReturn = sReturn &“FileSystem:" & drv1.FileSystem & vbCrLf
MsgBox sReturn
其中GetDrive方法返回一個(gè)與指定路徑中的驅(qū)動(dòng)器相對(duì)應(yīng)的 Drive 對(duì)象。該方法的語(yǔ)法格式為object.GetDrive drivespec,object是一個(gè)FSO對(duì)象的名稱,drivespec用于指定驅(qū)動(dòng)器的名稱。
按F5運(yùn)行上述代碼,按下TestDrive按鈕就會(huì)彈出一個(gè)消息框顯示C盤的信息。
(三)Folder對(duì)象
在FSO 對(duì)象模型中,提供了豐富的有關(guān)文件夾操作的方法,這些方法分別是:
FileSystemObject對(duì)象有關(guān)文件夾的方法
CreateFolder創(chuàng)建一個(gè)文件夾
DeleteFolder刪除一個(gè)文件夾
MoveFolder 移動(dòng)一個(gè)文件夾
CopyFolder復(fù)制一個(gè)文件夾
FolderExists查找一個(gè)文件夾是否在驅(qū)動(dòng)器上
GetFolder 獲得已有Folder對(duì)象的一個(gè)實(shí)例
GetParentFolderName找出一個(gè)文件夾的父文件夾的名稱
GetSpecialFolder找出系統(tǒng)文件夾的路徑
Folder對(duì)象的方法用途
Delete 創(chuàng)建一個(gè)文件夾
Move 移動(dòng)一個(gè)文件夾
Copy復(fù)制一個(gè)文件夾
Name檢索文件夾的名稱
在此需要強(qiáng)調(diào)一點(diǎn),前面我們?cè)?jīng)提到過(guò)FSO對(duì)象模型包含的方法是冗余的,所以Folder對(duì)象的Delete、Move、Copy方法和FileSystemObject對(duì)象的DeleteFolder、MoveFolder、CopyFolder方法實(shí)際上是相同的,因此在實(shí)際使用中可以任選其中的一種。
和Drive對(duì)象一樣,下面通過(guò)實(shí)例演示Folder對(duì)象的應(yīng)用。在VB下新建一個(gè)工程,然后在上面添加三個(gè)命令按鈕,然后在Form1的通用部分加入以下代碼:
Option Explicit
Dim fsoTest As New FileSystemObject
Dim folder1 As Folder
并且分別在三個(gè)命令按鈕的click事件輸入以下代碼:
Private Sub CmdCreate_Click()
‘ 獲取 Folder 對(duì)象。
Set folder1 = fsoTest.GetFolder(“C:")
‘創(chuàng)建文件夾
fsoTest.CreateFolder (“C:\Test")
MsgBox “folder C:\Test has created"
End Sub
Private Sub CmdDelete_Click()
‘ 獲取 Drive 對(duì)象。
Set folder1 = fsoTest.GetFolder(“C:")
‘刪除文件夾
fsoTest.DeleteFolder (“C:\Test")
MsgBox“folder C:\Test has deleted"
End Sub
Private Sub CmdGetPro_Click()
‘獲取文件夾的有關(guān)信息
Dim sReturn As String
Set folder1 = fsoTest.GetFolder(“C:\Windows")
‘sReturn = “The folder‘s Attributes is " & folder1.Attributes & vbCrLf
‘獲取最近一次訪問(wèn)的時(shí)間
sReturn = sReturn & “The folder‘s last access time is " & folder1.DateLastAccessed & vbCrLf
‘獲取最后一次修改的時(shí)間
sReturn = sReturn & “The folder‘s last modify time is " & folder1.DateLastModified & vbCrLf
‘獲取文件夾的大小
sReturn = sReturn & “The folder‘s size is " & FormatNumber(folder1.Size / 1024, 0)
sReturn = sReturn & “Kb" & vbCrLf
‘判斷文件或文件夾類型
sReturn = sReturn & “The type is " & folder1.Type & vbCrLf
MsgBox sReturn
End Sub
上述代碼中提到的CreateFolder方法的語(yǔ)法形式為object.CreateFolder(foldername)。foldername指定了要?jiǎng)?chuàng)建的文件夾的名稱,而DeleteFolder方法的語(yǔ)法形式為object.DeleteFolder folderspec[,force],其中,folderspec用來(lái)指定要?jiǎng)h除的文件夾的名稱,force是一個(gè)可選的布爾型參數(shù),如果希望刪除只讀屬性的文件夾則將該值設(shè)為TRUE,默認(rèn)為FALSE。至于代碼中用到的 Folder 對(duì)象的屬性限于篇幅,就不詳細(xì)介紹了,讀者可參考VB文檔中的相關(guān)內(nèi)容。
(四)File對(duì)象和TextStream對(duì)象
由于有關(guān)File對(duì)象的復(fù)制,刪除,移動(dòng)等操作和Folder對(duì)象類似,所以這部分內(nèi)容就不再重復(fù)。這里主要講述利用File對(duì)象和TextStream對(duì)象操作文本文件。
通常對(duì)文本文件的操作包括在文本文件中創(chuàng)建數(shù)據(jù),在文本文件中添加數(shù)據(jù),刪除文本文件的數(shù)據(jù)等操作。這些操作都可以通過(guò)File對(duì)象和FileSystemObject對(duì)象的相關(guān)方法完成。不過(guò)在使用之前,首先要?jiǎng)?chuàng)建一個(gè)文本文件,這可以通過(guò)三種方法完成。一種方法是使用FileSystemObject對(duì)象的 CreateTextFile 方法。要?jiǎng)?chuàng)建一個(gè)空文本文件,可以用以下語(yǔ)句:
Dim fsoTest As New FileSystemObject, fil1 As File
Set fil 1= fsoTest.CreateTextFile(“c:\testfile.txt", True)
第二種方法是使用 FileSystemObject 對(duì)象帶 ForWriting 標(biāo)志設(shè)置的 OpenTextFile 方法。
Dim fsoTest As New FileSystemObject, ts1 As New TextStream
Set ts1 = fsoTest.OpenTextFile(“c:\testfile.txt", ForWriting)
第三種方法是使用File對(duì)象的帶 ForWriting 標(biāo)志設(shè)置的 OpenAsTextStream 方法:
Dim fsoTest As