1. 程式人生 > >VB 中 FSO 物件模型介紹

VB 中 FSO 物件模型介紹

        從 Visual Basic 的第一版至今,VB 中有關檔案的處理都是通過使用 Open 、Write 以及其它一些相關的語句和函式來實現的。隨著軟體技術的不斷髮展,加上面向物件程式設計概念的日臻成熟,這些檔案操作語句已經不能適應軟體不斷增加的複雜程度的需要了。因此,從 VB 6.0 開始,微軟提出了檔案系統物件。

一、File System Object 模型介紹

檔案系統物件,英文名 File System Object,簡稱 FSO 物件模型,該模型提供了一個基於物件的工具來處理資料夾和檔案。這使您除了使用傳統的 Visual Basic 語句和命令之外,還可以使用您所熟悉的帶有一整套屬性、方法和事件的 object.method 語法來處理資料夾和檔案。

FSO 物件模型使應用程式能夠建立、改變、移動和刪除資料夾,或者檢測是否存在指定的資料夾,並能獲取資料夾的路徑。FSO 物件模型也能使您獲取關於資料夾的資訊,諸如名稱、建立日期或最近修改日期等等。

FSO 物件模型也使得對檔案的處理變得更加簡單。在處理檔案時,首要目標就是以一種可以有效利用空間和資源,並且易於存取的格式來儲存資料。需要能夠建立檔案、插入和修改資料、以及輸出(讀)資料。雖然可以將資料儲存在諸如 Jet 或 SQL 這樣的資料庫中,但是這樣做將在應用程式中加入相當數量的額外開支。出於多種原因,您不想有這樣的額外開支,或者資料存取要求不需要用一個與全功能資料庫關聯的所有額外功能,在這種情況下,用二進位制或文字檔案來儲存資料是最有效的解決方法。FSO 物件模型支援通過 TextStream 物件建立和操作文字檔案。但是,它還不支援二進位制檔案的建立和操作。要操作二進位制檔案,請使用帶 Binary 標誌的 Open 命令。

二、File System 物件介紹

1、Drive 物件:

允許收集關於系統所用的驅動器的資訊,諸如驅動器有多少可用空間,其共享名稱是什麼,等等。請注意,一個“驅動器”並不一定是一個硬碟,它可以是 CD-ROM 驅動器、RAM 盤等等。而且,驅動器不一定是和系統物理地連線,也可以通過一個 LAN 進行邏輯地連線。

2、Folder 物件:允許建立、刪除或移動資料夾,並向系統查詢資料夾的名稱、路徑等。

3、Files 物件:允許建立、刪除或移動檔案,並向系統查詢檔案的名稱、路徑等。

4、FileSystemObject 物件:

該組的主要物件,提供一整套用於建立、刪除、收集相關資訊,以及通常操作驅動器、資料夾和檔案的方法。與本物件相關聯的很多方法複製了其它物件中的方法。

5、TextStream 物件:允許您讀寫文字檔案。

三、如何用 FSO 物件模型程式設計

1、FSO 物件模型程式設計的主要任務

(1)使用 CreateObject 方法,或將一個變數宣告為 FileSystemObject 物件型別來建立一個 FileSystemObject 物件。
(2)對新建立的物件使用適當的方法。
(3)訪問該物件的屬性。

注意:FSO 物件模型包含在一個稱為 Scripting 的型別庫中,此型別庫位於 Scrrun.Dll 檔案中。如果還沒有引用此檔案,請從“屬性”選單的“引用”對話方塊選擇“Microsoft Scripting Runtime”項,然後就可以使用“物件瀏覽器”來檢視其物件、集合、屬性、方法、事件以及它的常數。

2、建立 FileSystemObject 物件

建立 FileSystemObject 物件,可以通過如下兩種方法完成:

將一個變數宣告為 FileSystemObject 物件型別:

Dim fso As New FileSystemObject

使用 CreateObject 方法來建立一個 FileSystemObject 物件:

Set fso = CreateObject("Scripting.FileSystemObject")

注意:在上面的語法中, Scripting 是型別庫的名稱,而 FileSystemObject 則是想要建立一個例項的物件的名稱。第一種方法只在 Visual Basic 中有效,而第二種方法在 Visual Basic 或 VBScript 中都是可行的。

3、使用適當的方法

例如,如果想要建立一個新物件,既可以使用 CreateFolder 方法也可以使用 CreateTextFile 方法。(FSO 物件模型不支援建立或刪除驅動器。)如果想要刪除物件,可以使用 FileSystemObject 物件的 DeleteFile 和 DeleteFolder 方法,或者 File 和 Folder 物件的 Delete 方法。使用適當的方法,還可以複製、移動檔案和資料夾。

注意:FileSystemObject 物件模型中有一些功能是冗餘的。例如,要複製一個檔案,既可以使用 FileSystemObject 物件的 CopyFile 方法,也可以使用 File 物件的 Copy 方法。這兩者的功能是完全相同的,兩者同時存在可以提供最大的程式設計靈活性。

4、訪問已有的驅動器、檔案和資料夾

要訪問一個已有的驅動器、檔案或資料夾,請使用 FileSystemObject 物件中相應的“get”方法,包括 GetDrive、GetFolder 和 GetFile。例如:

Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\test.txt")

注意:並不需要對新建立的物件使用“get”方法,因為“create”函式已經返回了一個控制代碼到新建立的物件。例如,如果使用 CreateFolder 方法建立了一個新的資料夾,就沒有必要使用 GetFolder 方法來訪問該物件的諸如名稱、路徑、大小等屬性,只要給 CreateFolder 函式設定一個變數來獲取新建資料夾的控制代碼,然後就可以訪問其屬性、方法和事件。例如:

Private Sub Create_Folder()
   Dim fso As New FileSystemObject, fldr As Folder
   Set fldr = fso.CreateFolder("C:\MyTest")
   MsgBox "Created folder: " & fldr.Name
End Sub

5、訪問物件的屬性

一旦有了物件的控制代碼,就能夠訪問其屬性。例如,假定您想要獲得一個特定資料夾的名稱。首先要建立該物件的一個例項,然後通過適當的方法(在本例中是 GetFolder 方法,因為該資料夾已經存在)得到其控制代碼:

Set fldr = fso.GetFolder("c:\")

現在有了一個 Folder 物件的控制代碼,您可以檢視其 Name 屬性:

Debug.Print "Folder name is: "; fldr.Name

如果想要找出一個檔案的最新修改時間,可以使用如下的語法:

Dim fso As New FileSystemObject, fil As File
Set fil = fso.GetFile("c:\detlog.txt") ' 獲得要查詢的 File 物件。
Debug.Print "File last modified: "; fil.DateLastModified ' 顯示資訊。

四、使用驅動器和資料夾

可以在程式中使用 FSO 物件模型來處理驅動器和資料夾,例如複製和移動資料夾、獲得驅動器和資料夾的資訊,等等。

1、獲得驅動器的資訊

Drive 物件允許獲得一個系統的各個驅動器的資訊,這些驅動器可以是物理的,也可以是位於網路上的。通過該物件的屬性可以獲得下列資訊:

(1)以位元組表示的驅動器總空間(TotalSize 屬性)
(2)以位元組表示的驅動器可用空間(AvailableSpace 或 FreeSpace 屬性)
(3)給驅動器指定的字母號(DriveLetter 屬性)
(4)驅動器型別,諸如可移動的、固定的、網路、CD-ROM、或者 RAM 盤(DriveType 屬性)
(5)驅動器序列號(SerialNumber 屬性)
(6)驅動器使用的檔案系統型別,諸如 FAT、 FAT32、 NTFS等等(FileSystem 屬性)
(7)驅動器是否可用(IsReady 屬性)
(8)共享和/或卷標的名稱(ShareName 和 VolumeName 屬性)
(9)驅動器的路徑或根資料夾(Path 和 RootFolder 屬性)

2、Drive 物件用法示例

下列示例說明了如何使用 Drive 物件來收集有關驅動器的資訊。請記住,在下面的程式碼中並沒有對一個實際 Drive 物件的引用,而是使用 GetDrive 方法來獲得一個對已有 Drive 物件(本例中就是 drv)的引用:

Private Sub Command3_Click()
   Dim fso As New FileSystemObject, drv As Drive, s As String
   Set drv = fso.GetDrive(fso.GetDriveName("c:"))
   s = "Drive " & UCase("c:") & " - "
   s = s & drv.VolumeName & vbCrLf
   s = s & "Total Space: " & FormatNumber(drv.TotalSize / 1024, 0)
   s = s & " Kb" & vbCrLf
   s = s & "Free Space: " & FormatNumber(drv.FreeSpace / 1024, 0)
   s = s & " Kb" & vbCrLf
   MsgBox s
End Sub

3、使用 CurDir、 ChDrive、 ChDir 或 App.Path

如果使用 CurDir 函式、ChDrive 和 ChDir 語句、或者 Path 屬性(App.Path),請注意,它們返回的有可能是一個 UNC 路徑(形如 \\Server\Share,而不是一個驅動器路徑 E:\Server\Share),這取決於執行程式或工程的方式。

在如下的情況,App.Path 返回一個 UNC 路徑:

(1)當執行一個從共享網路載入的工程時,即使該網路共享已經被對映到一個驅動器號。
(2)當從一個共享網路執行一個已編譯的可執行檔案時(但是僅當通過一個 UNC 路徑執行該程式)。

ChDrive 不能處理 UNC 路徑,因此當 App.Path 返回一個 UNC 路徑給 ChDrive 時,就會產生一個錯誤。要避免這個錯誤,可以在 ChDrive 語句之前新增 On Error Resume Next,或者測試 App.Path 的頭兩個字元是否是反斜槓。例如:

On Error Resume Next
ChDrive App.Path
ChDir App.Path

這個改動將處理所有使用 UNC 路徑從 Windows 啟動程式(例如,在“啟動”選單的“執行”對話方塊中)的情況,因為 Windows 將當前的目錄設為一個 UNC 路徑。ChDir 可以正確地處理 UNC 路徑之間的轉換。(ChDrive 的失效可以被忽略,因為 UNC 路徑當中沒有驅動器號)

然而,如果在 MS-DOS 的命令列提示符後鍵入一個 UNC 路徑來執行程式的話,上面的程式碼不會生效。這是因為命令列提示符用的總是當前目錄的驅動器路徑,所以 CurDir 被設為一個驅動器路徑。ChDir 不會產生錯誤,但是它不能將一個目錄從驅動器路徑變為 UNC 路徑。在這種情況下,唯一的解決辦法是定位一個已經對映為 UNC 路徑中指定共享的本地驅動器,或者使用網路命令來建立這樣一個對映。

如果工程是從一個網路共享載入到 Visual Basic 整合開發環境(IDE)中的話,那麼當執行工程時 App.Path 將返回一個 UNC 路徑,而且ChDrive 失敗併產生一個錯誤。ChDir 雖然不會出錯,但目錄並未改變。唯一的解決辦法是通過手工來設定驅動器和目錄。例如:

Const PROJECTSHARE = "E:\VBPROJ\MYPROJECT"
#Const Debug = True
#If Debug Then
    ChDrive PROJECTSHARE
    ChDir PROJECTSHARE
#Else
    On Error Resume Next
    ChDrive App.Path
    ChDir App.Path
#End If

如果不止一個人可能在共享網路上開啟該工程,那麼可以使用一個 DOS 環境變數來允許每個人都擁有自己對該共享的對映。例如:

#Const Debug = True
#If Debug Then
    ChDrive Environ("MYPROJECTDIR")
    ChDir Environ("MYPROJECTDIR")
#Else
    On Error Resume Next
    ChDrive App.Path
    ChDir App.Path
#End If

MYPROJECTDIR 的值指定了被對映的驅動器號和路徑,例如:

SET MYPROJECTDIR=M:\VBProj\MyProject

4、使用資料夾

下面列出了普通的資料夾任務以及完成這些任務的方法:

(1)建立一個資料夾:FileSystemObject.CreateFolder 
(2)刪除一個資料夾:Folder.Delete 或 FileSystemObject.DeleteFolder 
(3)移動一個資料夾:Folder.Move 或 FileSystemObject.MoveFolder 
(4)複製一個資料夾:Folder.Copy 或 FileSystemObject.CopyFolder 
(5)檢索資料夾的名稱:Folder.Name 
(6)查詢一個資料夾是否在驅動器上:FileSystemObject.FolderExists 
(7)獲得已有Folder物件的一個例項:FileSystemObject.GetFolder 
(8)找出一個資料夾的父資料夾的名稱:FileSystemObject.GetParentFolderName 
(9)找出系統資料夾的路徑:FileSystemObject.GetSpecialFolder

例子:

如何使用 Folder 物件和 FileSystemObject 物件來操作資料夾並獲得其資訊:

Private Sub Command1_Click()
   ' 獲得 FileSystemObject 的例項。
   Dim fso As New FileSystemObject, fldr As Folder, s As String
   ' 獲取 Drive 物件。
   Set fldr = fso.GetFolder("c:")
   ' 顯示父資料夾名。
   Debug.Print "Parent folder name is: " & fldr
   ' 顯示驅動器名。
   Debug.Print "Contained on drive " & fldr.Drive
   ' 顯示根檔名。
   If fldr.IsRootFolder = True Then
      Debug.Print "This folder is a root folder."
   Else
      Debug.Print "This folder isn't a root folder."
   End If
   ' 用 FileSystemObject 物件建立一個新的資料夾。
   fso.CreateFolder ("c:\Bogus")
   Debug.Print "Created folder C:\Bogus"
   ' 顯示資料夾的基本名稱。
   Debug.Print "Basename = " & fso.GetBaseName("c:\bogus")
   ' 刪除新建的資料夾。
   fso.DeleteFolder ("c:\Bogus")
   Debug.Print "Deleted folder C:\Bogus"
End Sub

五、使用檔案

通過使用新的面向物件的 FSO 物件,諸如 Copy、 Delete、 Move 以及 OpenAsTextStream,或者使用傳統的函式,諸如 Open、 Close、 FileCopy、 GetAttr 等等,您可以使用 Visual Basic 中的檔案。請注意,不用考慮其檔案型別就可以移動、複製或刪除檔案。

1、用 File System Objects 建立檔案並新增資料

有三種不同方法來建立一個順序文字檔案(有時被稱為“文字流”)。

(1)使用 CreateTextFile 方法。例如:

 Dim fso As New FileSystemObject, fil As File
Set fil = fso.CreateTextFile("c:\testfile.txt", True)

注意:FSO 物件模型尚不支援建立隨機檔案或二進位制檔案。要建立隨機檔案和二進位制檔案,請使用帶 Random 或 Binary 標誌的 Open 命令。

(2)使用 OpenTextFile 方法。例如:

Dim fso As New FileSystemObject, ts As New TextStream
Set ts = fso.OpenTextFile("c:\test.txt", ForWriting)

(3)使用帶 ForWriting 標誌設定的 OpenAsTextStream 方法。例如:

Dim fso As New FileSystemObject, fil As File, ts As TextStream
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateTextFile ("test1.txt")
Set fil = fso.GetFile("test1.txt")
Set ts = fil.OpenAsTextStream(ForWriting)

2、新增資料到檔案

文字檔案一經建立,就可以分三步向其中加入資料:

(1)開啟文字檔案以備寫入資料。
(2)寫入資料。
(3)關閉檔案。

要開啟檔案,可以使用 File 物件的 OpenAsTextStream 方法,或者 FileSystemObject 物件的 OpenTextFile 方法。

要向開啟的文字檔案中寫入資料,可以使用 TextStream 物件的 Write 或 WriteLine 方法。它們之間的唯一差別是 WriteLine 在指定的字串末尾新增換行符。

如果想要向文字檔案中新增一個空行,請使用 WriteBlankLines 方法。

要關閉一個已開啟的檔案,請使用 TextStream 物件的 Close 方法。

下面這個例子示範瞭如何開啟一個檔案,使用上述三種寫入方法向該檔案中新增資料,然後關閉檔案:

Sub Create_File()
    Dim fso, txtfile
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txtfile = fso.CreateTextFile("c:\testfile.txt", True)
    txtfile.Write ("這是一個測試例子。") ' 寫入一行。
    ' 寫入一行帶有換行符的文字。
    txtfile.WriteLine("Testing 1, 2, 3.")
    ' 向檔案中寫入三個換行符。
    txtfile.WriteBlankLines(3)
    txtfile.Close
End Sub

3、使用 File System Objects 讀取檔案

要從一個文字檔案中讀取資料,請使用 TextStream 物件的 Read、 ReadLine 或 ReadAll 方法。

    1、Read 方法:從一個檔案中讀取指定數量的字元
    2、ReadLine 方法:讀取一整行(不包括換行符)
    3、ReadAll 方法:讀取一個文字檔案的所有內容

如果使用 Read 或 ReadLine 方法並且想要跳過資料的某些部分,可以使用 Skip 或 SkipLine 方法。

這些讀取方法產生的文字被儲存在一個字串中,而這個字串可以在一個控制元件中顯示,也可以被字串操作符分解(諸如 Left、 Right 和 Mid)、合併等等。

注意:vbNewLine 常數包含一個或多個字元(取決於作業系統)使得游標移至下一行的開頭(回車/換行)。請注意,有的字串末尾可能有這樣的非列印字元。

例子:

Sub Read_Files()
    Dim fso As New FileSystemObject, txtfile, _
      fil1 As File, ts As TextStream
    Set txtfile = fso.CreateTextFile("c:\testfile.txt", True)
    MsgBox "正在寫入檔案"
    ' 寫入一行。
    Set fil1 = fso.GetFile("c:\testfile.txt")
    Set ts = fil1.OpenAsTextStream(ForWriting)
    ts.Write "Hello World"
    ts.Close
    ' 讀取檔案的內容。
    Set ts = fil1.OpenAsTextStream(ForReading)
    s = ts.ReadLine
    MsgBox s
    ts.Close
End Sub

4、移動、複製和刪除檔案

對檔案的移動、複製和刪除,FSO 物件模型都提供了兩種方法:

(1)移動一個檔案:File.Move 或 FileSystemObject.MoveFile 
(2)複製一個檔案:File.Copy 或 FileSystemObject.CopyFile 
(3)刪除一個檔案:File.Delete 或 FileSystemObject.DeleteFile

例子:

本例先在 C 盤的根目錄下建立了一個文字檔案,並向其中寫入一些資訊,然後將該檔案移至一個名叫 \tmp 的目錄,並複製到一個叫 \temp 的目錄下,最後刪掉該檔案在這兩個子目錄下的拷貝。要執行本例,請先確認在C盤的根目錄下已經存在名叫 \tmp 和 \temp 的目錄。

Sub Manip_Files()
    Dim fso as New FileSystemObject, txtfile, fil1, fil2
    Set txtfile = fso.CreateTextFile("c:\testfile.txt", True)
    MsgBox "寫入檔案"
    ' 寫入一行。
    txtfile.Write ("這是一個測試例子。")
    ' 關閉要寫入的檔案。
    txtfile.Close
    MsgBox "移動檔案到 c:\tmp"
    ' 獲得C盤根目錄下的一個檔案控制代碼。
    Set fil1 = fso.GetFile("c:\testfile.txt")
    ' 將該檔案移至 \tmp 目錄下。
    fil1.Move ("c:\tmp\testfile.txt")
    MsgBox "複製檔案到 c:\temp"
    ' 將該檔案複製到 \temp 目錄下。
    fil1.Copy ("c:\temp\testfile.txt")
    MsgBox "刪除檔案"
    ' 獲得這些檔案當前位置的控制代碼。
    Set fil1 = fso.GetFile("c:\tmp\testfile.txt")
    Set fil2 = fso.GetFile("c:\temp\testfile.txt")
    ' 刪除這些檔案。
    fil1.Delete
    fil2.Delete
MsgBox "全部完成!"

六、總結

通過上面的介紹,我們可以看到,FSO 物件模型在傳統的檔案操作之外,提供了一種更方便、功能更強大的操作方法。不過,我們還需要注意到 FSO 物件模型目前還不完善,當前使用的 FSO 物件模型還不支援建立隨機檔案或二進位制檔案。要建立隨機檔案和二進位制檔案,仍然要使用帶 Random 或 Binary 標誌的 Open 命令。但從目前 FSO 物件模型的實際應用來看,我們仍然可以將 FSO 物件模型作為一種比較簡便的檔案操作解決方案。

1 Print 判斷光碟機的碟符

Function GetCDROM() ' 返回光碟機的碟符(字母)
    Dim Fso As New FileSystemObject '建立 FSO 物件的一個例項
    Dim FsoDrive As Drive, FsoDrives As Drives '定義驅動器、驅動器集合物件
    Set FsoDrives = Fso.Drives
    For Each FsoDrive In FsoDrives '遍歷所有可用的驅動器
        If FsoDrive.DriveType = CDRom Then '如果驅動器的型別為 CDrom
            GetCDROM = FsoDrive.DriveLetter '輸出其碟符
        Else
            GetCDROM = ""
        End If
    Next
    Set Fso = Nothing
    Set FsoDrive = Nothing
    Set FsoDrives = Nothing
End Function

2 .判斷檔案?資料夾是否存在

'返回布林值:True 存在,False 不存在,filername 檔名
Function FileExist(filename As String)
    Dim Fso As New FileSystemObject
    If Fso.FileExists(filename) = True Then
        FileExist = True
    Else
        FileExist = False
    End If
Set Fso = Nothing