深入Scripting Runtime Library 之一
www.applevb.com
什麼是Scripting Runtime Library?按照一般的說法,Scripting Runtime Library(以下簡稱SR)提供了微軟
“忘記”放到Visual Basic中的基本的檔案系統操作函數何對象。
點擊菜單的 Project | Referrences 項,在References選擇視窗的References列表中選擇 Microsoft Scripting Runtime
項。然後單擊 “確定”鍵選擇退出就可以將Scripting Runtime Library加入到VB工程檔案中。(在下面的程式中在
添加代碼之前都要執行這一步操作,凡是在下面提到加入SR庫,都是指這一步)一個SR對象包括FileSystemObject
對象和Directionary對象,分別對應檔案系統操作和字典操作。
例如 Dim fsoSys As New Scripting.FileSystemObject 就定義了一個FileSystemObject對象
FileSystemObject對象包含擷取磁碟機資訊的Drive對象;對檔案進行複製、刪除、移動等操作的File對象;對
檔案夾進行建立、複製、刪除、移動和擷取檔案夾下的檔案和子檔案夾的Folder對象;建立、讀取、寫入文字檔的
TextStream對象。下面對這些對象的屬性和操作方法進行分門別類的介紹
一、對於磁碟機Drive對象的操作
通過一個Drive對象可以獲得該對象定義的磁碟機的容量、屬性等資訊,使用FileSystemObject對象的GetDrive方
法可以得到一個Drive對象。
下面是一個Drive對象操作的範例。
首先在VB中建立一個新的工程。加入SR庫。然後在Form1中加入一個ListBox控制項、一個PictureBox不要改變它們
的屬性,然後在Form1的代碼視窗中加入以下代碼:
Option Explicit
Dim fsoSystem As New FileSystemObject
Dim fsoDrives As Drives
Dim fsoDrive As Drive
Private Sub Form_Load()
Dim sDrive As String
Dim sDriveType As String
Dim bHasCDRom As Boolean
Set fsoDrives = fsoSystem.Drives
For Each fsoDrive In fsoDrives
sDrive = fsoDrive.DriveLetter & ": "
Select Case fsoDrive.DriveType
Case 0: sDriveType = "未知類型磁碟機"
Case 1: sDriveType = "抽取式磁碟機"
Case 2: sDriveType = "固定磁碟機"
Case 3: sDriveType = "遠程磁碟機"
Case 4: sDriveType = "CDROM磁碟機"
Case 5: sDriveType = "RAM Disk"
End Select
If fsoDrive.DriveType = CDRom Or fsoDrive.DriveType = CDRom Then
bHasCDRom = bHasCDRom Or fsoDrive.IsReady
End If
sDrive = sDrive & sDriveType
List1.AddItem (sDrive)
Next
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set fsoSystem = Nothing
End Sub
Private Sub List1_Click()
Dim astr$
Dim fsoDrive As Drive
If List1.ListIndex > -1 Then
astr = Left$(List1.List(List1.ListIndex), 1)
Set fsoDrive = fsoSystem.GetDrive(astr)
'檢查磁碟機是否準備好
If Not fsoDrive.IsReady Then
MsgBox ("該磁碟機未準備好或未插入磁碟")
Exit Sub
End If
'輸出磁碟機資訊
With Picture1
.Cls
.CurrentX = 30: .CurrentY = 30
Picture1.Print "總容量" + Format$(fsoDrive.TotalSize, _
"###,###,###,###,###,##0") + " 位元組"
Picture1.Print "可用容量" + Format$(fsoDrive.AvailableSpace, _
"###,###,###,###,###,##0") + " 位元組"
Picture1.Print fsoDrive.DriveLetter & ": 使用的檔案系統為: " & _
fsoDrive.FileSystem
End With
Set fsoDrive = Nothing
End If
End Sub
運行程式,程式檢測系統中所有的可用磁碟機。然後將它們在List1上列出來,點擊List1上的磁碟機清單項目,
該磁碟機的基本資料就會顯示在Picture1上,如果該磁碟機未準備好(例如未插入磁碟或光碟片),程式就會出現
提示。利用該方法可以檢測軟碟機或者CD-ROM磁碟機中是否有盤以及實現向超級解霸中的CD自動檢測功能。需要注意
的一點是:上面的程式在檢測磁碟容量時只支援2GB的容量,也就是說如果你的分區大於2G的話,檢測出來的容量
也不會超過2GB。
二、對於檔案夾Folder對象的操作
通過FileSystemObject的GetFolder方法可以獲得一個Folder對象。下面的範例介紹了如何建立一個Folder對象
和利用該對象建立、刪除檔案夾和擷取子檔案夾的操作。
首先建立一個工程檔案,在其中加入SR庫。在Form1中加入一個TreeView控制項,兩個CommandButton控制項,然後
在Form1中加入以下代碼:
Dim fsoSys As New Scripting.FileSystemObject
Dim fsoRootFolder As Folder
Private Sub Form_Load()
Dim fsoSubFolder As Folder
Dim nodRootNode As Node
Dim nodChild As Node
Dim astr$
Set nodRootNode = TreeView1.Nodes.Add(, , "Root", "c:/")
Set fsoRootFolder = fsoSys.GetFolder("c:/")
For Each fsoSubFolder In fsoRootFolder.SubFolders
astr = fsoSubFolder.Path
Set nodChild = TreeView1.Nodes.Add("Root", tvwChild, astr, fsoSubFolder.Name)
Next
Set fsoRootFolder = Nothing
Command1.Caption = "建立目錄"
Command2.Caption = "刪除目錄"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set fsoSys = Nothing
End Sub
Private Sub Command1_Click()
Dim fsoFolder As Folder
'檢查目錄是否存在,如果目錄不存在則建立新目錄
If fsoSys.FolderExists("c:/temp") Then
MsgBox ("目錄c:/temp已經存在,無法建立目錄")
Else
Set fsoFolder = fsoSys.CreateFolder("c:/temp")
Set fsoFolder = Nothing
End If
End Sub
Private Sub Command2_Click()
'檢查目錄是否存在,如存在則刪除目錄
If fsoSys.FolderExists("c:/temp") Then
fsoSys.DeleteFolder ("c:/temp")
Else
MsgBox ("目錄c:/temp不存在")
End If
End Sub
運行程式,程式建立一個指向C盤根目錄的Folder對象並擷取它的所有子檔案夾加入到TreeView中,雙擊
TreeView1中的 "c:/" 就可以開啟分支查看c:/目錄下的所有子目錄名。點擊Command1就可以建立 c:/temp
目錄,如果目錄已存在程式會給出提示;點擊Command2刪除c:/temp目錄。
三、對於檔案File對象的操作
通過FileSystemObject的GetFile方法可以建立一個指向磁碟上一個檔案的File對象。下面的範例介紹了如何
利用File對象獲得檔案的基本資料。
首先建立一個新的工程檔案,加入SR庫,在Form1中加入一個FileListBox控制項和一個PictureBox控制項,不要使
二者重疊,然後在Form1中加入以下代碼:
Option Explicit
Dim fsoSys As New Scripting.FileSystemObject
Private Sub File1_Click()
Dim fsoFile As File
Dim astr$
Dim sDateCreate
On Error GoTo errfun
'獲得File1中的檔案名稱並據此建立一個File對象
Set fsoFile = fsoSys.GetFile("c:/windows/" + File1.List(File1.ListIndex))
Picture1.Cls
Picture1.CurrentY = 10
Picture1.Print "檔案名稱 " + fsoFile.Name
Picture1.Print "Dos檔案名稱 " + fsoFile.ShortName
Picture1.Print "檔案類型 " + fsoFile.Type
Picture1.Print "檔案大小 " & Str(fsoFile.Size)
sDateCreate = fsoFile.DateCreated
Picture1.Print "建立時間 " & sDateCreate
Picture1.Print "修改時間 " & fsoFile.DateLastModified
Picture1.Print "訪問時間 " & fsoFile.DateLastAccessed
If fsoFile.Attributes And Archive Then
astr = astr + "常規 "
End If
If fsoFile.Attributes And ReadOnly Then
astr = astr + "唯讀 "
End If
If fsoFile.Attributes And Hidden Then
astr = astr + "隱藏 "
End If
If fsoFile.Attributes And System Then
astr = astr + "系統 "
End If
If fsoFile.Attributes And Compressed Then
astr = astr + "壓縮 "
End If
Picture1.Print "檔案類型 " + astr
Set fsoFile = Nothing
Exit Sub
errfun:
'如果檔案建立時間為未知就會導致錯誤,這裡是錯誤處理程式段
sDateCreate = "(未知)"
Resume Next
End Sub
Private Sub Form_Load()
File1.Path = "c:/windows"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set fsoSys = Nothing
End Sub
四、對於TextStream對象的操作
對於通過VB編程對文字檔進行IO操作,一直是一個頭疼的問題。如果使用Inout$函數一次把開啟的檔案內容
全部讀取到一個字串中的話,對於某一行的字串操作就會十分不方便,同時還會有一個字串不能大於65K而導致
無法讀取大檔案的問題。而採用Line Input的方法又喪失了對檔案整體操作的方便性。而TextStream對象提供了一種
基於流的檔案操作方式,使得對文字檔的操作方便了很多。
利用FileSystemObject的CreateTextFile方法或者OpenAsTextStream 方法可以建立一個TextStream對象,該
對象包含了檔案中的所有內容,可以通過唯讀、唯寫和追加方式開啟檔案。當建立了TextStream對象只後,使用者就可以
直接對TextStream進行操作,從而增加了對檔案操作的方便性和安全性。
下面是一個TextStream對象操作的範例。
首先建立一個新的工程檔案,加入RS庫,在Form1中加入三個CommandButon控制項和一個TextBox控制項,在C:/下建立
一個help.txt的檔案,然後在Form1中加入以下代碼:
Option Explicit
Dim fsoFile As New FileSystemObject
Dim fsoTextStream As TextStream
Private Sub Command1_Click()
If Dir$("c:/help.txt") = "" Then
MsgBox ("c:/help.txt檔案不存在,程式將退出")
Set fsoFile = Nothing
End
End If
'開啟檔案
Set fsoTextStream = fsoFile.OpenTextFile("c:/help.txt", ForReading)
Text1.Text = fsoTextStream.ReadAll '將檔案讀取到Text1中
End Sub
Private Sub Command2_Click()
Dim fsoTextTemp As TextStream
'關閉原來的檔案,並建立一個同名的新的檔案,將更新的檔案流寫入到新檔案中
fsoTextStream.Close
Set fsoTextStream = Nothing
Set fsoTextTemp = fsoFile.CreateTextFile("c:/help.txt", True)
fsoTextTemp.Write Text1.Text
fsoTextTemp.Close
Set fsoTextTemp = Nothing
Command1_Click
Command2.Enabled = False
End Sub
Private Sub Command3_Click()
fsoTextStream.Close
Set fsoTextStream = Nothing
Set fsoFile = Nothing
End
End Sub
Private Sub Form_Load()
Text1.Text = ""
Command1.Caption = "開啟檔案"
Command2.Caption = "儲存檔案"
Command3.Caption = "退出"
Command2.Enabled = False
End Sub
Private Sub Text1_Change()
Command2.Enabled = True
End Sub
運行程式,點擊Command1就可以開啟c:/help.txt檔案,按Command2儲存檔案,按Command3退出。