簡介
有經驗的 Visual Basic 開發人員最初可能會認為Visual 中的變化使本來已經熟悉的領域變得陌生而難以駕馭其實過去開發的成果仍然可以使用例如Visual Basic 運行時文件 I/O 方法就是大家比較熟悉的同樣以前曾涉獵過 FileSystemObject 對象的開發人員也可以繼續在這一領域暢游盡管公共語言運行時領域可能讓人感到陌生並且到處都是以對象為中心的怪物但同時它提供的功能卻極具誘惑力例如 FileSystemWatcher 或 FileIOPermissions 類中的新功能
事實上唯一讓 Visual Basic NET 開發人員望而卻步的是如何從這三種方法中進行選擇對許多應用程序而言對文件和目錄進行操作是最重要的但是 Visual Basic NET 所提供的靈活方法可能會使人感到困惑並且會提出下列問題Visual Basic NET 提供什麼樣的文件訪問?何時使用 FileSystemObject 對象?使用公共語言運行時中的方法有哪些好處?是否需要專門使用一種方法?如何選擇方法?
Visual Basic NET 中的文件方法
讓我們先看看 MicrosoftVisualBasic 命名空間這可以為那些被全新的 NET 領域嚇壞的開發人員帶來一些安慰和信心命名空間包含許多熟悉的函數和方法除了部分名稱有少許改動外大部分名稱仍保持不變如 DirInputPrintSeekWrite 等等
在選擇運行時函數時主要應考慮寫入文件或從文件中收集的信息的類型Visual Basic NET 為三種類型的文件提供了訪問方法每種方法適用於一種特定的數據類型二進制順序和隨機
二進制訪問允許您以任意方式存儲和訪問數據這種方法對於變長字段尤為有用
隨機訪問允許您以記錄的方式存儲和訪問信息這種方法假定記錄是等長的順序訪問允許您在文本文件中讀取和寫入字符串
這些不同類型的文件訪問所使用的函數發生了一些變化最顯著的變化是用 FilePut/FilePutObject 和 FileGet/FileGetObject 函數代替 Put 和 Get 函數在 Visual Basic NET 中FilePut 和 FileGet 映射到 Put 和 Get 函數FilePutObject 和 FileGetObject 用於將 Object 類型(等價於 Visual Basic 早期版本中的 Variant 類型)的對象寫入文件
例如下面是 Visual Basic 的代碼
Dim Person As Variant
If IdentifyPeopleByName Then
Person = 我的姓名
Else
Person =
EndIf
Put # Person
在 Visual Basic NET 中變為
FileOpen( c:\testtxt OpenModeBinary)
Dim Person As Object
If IdentifyPeopleByName Then
Person = 我的姓名
Else
Person =
EndIf
FilePutObject( Person)
FileClose()
總之對於有經驗的 Visual Basic 程序員來說這一方面應該很容易掌握下表列出了 Visual Basic NET 中用於文件和目錄操作的函數並提供了介紹各個函數的相應主題的鏈接
函數 |
說明 |
CurDir
返回表示當前目錄的 String 值
Dir
返回 String 值
表示與指定模式或文件屬性相匹配的文件名
目錄名或文件夾名
或者表示驅動器的卷標
EOF
當為隨機輸入或順序輸入而打開的文件到達末尾時
返回 Boolean 值 True
FileClose
將 I/O 寫入到使用 FileOpen 函數打開的文件
FileCopy
復制文件並保留原文件
FileDateTime
返回 Date 值
表明最近一次修改文件的日期和時間
FileLen
返回 Long 值
表明文件的長度(字節)
FileOpen
打開用於輸入或輸出的文件
FreeFile
返回 Integer 值
指定 FileOpen 函數可以使用的下一個文件的編號
GetAttr
返回 FileAttribute 值
表示文件
文件夾或目錄的屬性
Input
從打開的順序文件讀取數據並將該數據分配給變量
InputString
返回 String 值
包含在 Input 或 Binary 模式下打開的文件中的字符
LineInput
從打開的順序文件中讀取一行並將其分配給 String 變量
Loc
返回 Long 值
指定在打開的文件中的當前讀/寫位置
LOF
返回 Long 值
表示使用 FileOpen 函數打開的文件的大小(字節)
Print
將顯示格式的數據寫入順序文件
PrintLine
將顯示格式的數據寫入順序文件
並以回車符結束
Seek
返回 Long 值
指定在使用 FileOpen 函數打開的文件中的當前讀/寫位置
或為使用 FileOpen 函數打開的文件中的下一個讀/寫操作設置位置
SetAttr
設置文件的屬性信息
如 ReadOnly
Hidden
Directory
Archive 等等
Write
將數據寫入順序文件
通常使用 Input 函數從文件中讀取使用 Write 函數寫入的數據
WriteLine
將數據寫入順序文件
並以回車符結束
優點和缺點
Visual Basic NET 運行時提供的函數有兩個主要優點即為開發人員所熟悉並且易於使用Visual Basic NET 的核心功能仍然保留其為人所熟悉直觀和靈活的特點同時提供了舒適的 NET 開發環境
同樣將在 Visual Basic 早期版本中編寫的程序升級到 NET或者創建能夠與在 Visual Basic 早期版本中編寫的應用程序正常交互的應用程序也相對簡單
Visual 函數還提供二進制文件訪問為使用變長字段時提供了更好的選擇而 FileSystemObject 對象(將在下一節介紹)則沒有此功能
最後一點在從 Visual Basic NET 中使用 Visual Basic NET 內置文件 I/O 函數時沒有需要特別注意的事項(如需要導入命名空間)
Visual Basic NET 文件 I/O 函數僅支持 StringDateIntegerLongSingleDouble 和 Decimal 寫入類型以及這些類型的結構和數組這是使用這些函數時的一個缺點此外不能將類序列化因此在這些情況下直接使用 SystemIO 類性能可能會更佳
代碼示例
如以下各例所示使用 Visual Basic 運行時方法進行文件和目錄操作是開發人員所熟悉的
以下示例將檢查文件是否存在如果存在則使用 FileCopy 函數將其復制到新文件
Private Sub CopyFiles()
Dim checkFile As String
checkFile = Dir$(c:\testtxt)
If checkFile = testtxt
FileCopy c:\testtxt c:\newtxt
End If
End Sub
以下示例使用 FilePut 函數將數據寫入文件FilePut 函數與 Visual Basic 早期版本的 Put 函數相對應結構 CustomerRecord 的三個記錄被寫入文件
Structure CustomerRecord
Public OrderNumber As Integer
Public Name As String
Public OrderDate As Date
End Structure
Sub WriteData()
Dim MyRecord As CustomerRecord
Dim RecordNumber As Integer
Dim RecordDate As Date
打開文件進行隨機訪問
FileOpen( C:\TESTFILEtxt OpenModeBinary)
For RecordNumber = To 循環 次
MyRecordOrderNumber = RecordNumber 定義 OrderNumber
MyRecordOrderDate = RecordDate 定義 OrderDate
MyRecordName = 我的姓名 & RecordNumber 創建字符串
FilePut( MyRecord) 將記錄寫入文件
Next RecordNumber
FileClose()
End Sub
FileSystemObject
與 MicrosoftVisualBasic 命名空間提供的函數和方法類似Visual Basic 早期版本的用戶也應當熟悉 FileSystemObject 對象在 Visual Basic NET 中仍然可以使用此對象
FileSystemObject (FSO) 模型將文件目錄和驅動器表示為 COM 對象每個對象都有自己的屬性和方法您可以創建和操縱這些對象並使用這些對象的屬性來查找信息如目錄內容文件大小對象的創建時間等等通過創建和訪問 FileSystemObject 對象的實例可以訪問表示系統文件目錄和驅動器的對象
FSO 對象模型位於 Microsoft 腳本運行時類型庫 (Scrrundll) 中支持通過 TextStream 對象創建和操縱文本文件有關詳細信息請參閱 TextStreamFileStream 類圍繞文件提供一個數據流允許對文件系統進行同步或異步讀寫操作以及緩沖輸入和輸出以改善性能信息被寫入緩沖區只有當緩沖區已滿或調用 Close 方法時緩沖區中的內容才會被寫入文件
優點和缺點
FSO 的主要優點是它可以將許多文件 I/O 函數集合到單個對象中通過創建該對象的實例可以訪問對象的方法和屬性
下表列出了 FSO 對象模型的基本組件並提供了與相應主題對應的鏈接這些主題列出了適用於創建和操縱文件驅動器及目錄的屬性和方法
對象 |
說明 |
FileSystemObject
創建與刪除驅動器
文件夾和文件
獲取其信息並對其進行常規操作
與此對象相關的許多方法都與其他對象中的相應方法相同
Drive
獲取關於連接到系統的驅動器的信息
如可用空間及其共享名稱
File
創建
刪除或移動文件
以及在系統中查詢文件的名稱
路徑和其他信息
Folder
創建
刪除或移動文件夾
以及在系統中查詢文件夾的名稱
路徑和其他信息
TextStream
讀寫文本文件
FSO 對象模型也適用於線程它提供了一個用於異步 I/O 的構造函數如當使用 BeginRead 和 BeginWrite 方法時該函數可使主線程繼續允許用戶稍後再處理數據多個 I/O 請求可以同時掛起
但是FSO 也有一些不足之處如上所述它只能對文本文件進行操作要操縱二進制文件您必須使用指針指向內存地址或字節數組但 FSO 對象不支持此操作
此外當您讀取或寫入大量內容時存儲在緩沖區中的信息可能會產生很高的內存命中率還有您不能管理許可權限或文件和文件夾屬性
實現方法
可以使用 Object Browser(對象浏覽器)來查看 FSO 模型的對象集合屬性方法事件和常數要在 Object Browser(對象浏覽器)中查看 FSO必須首先向 Microsoft 腳本運行時類型庫添加一個引用
向 Microsoft 腳本運行時類型庫添加引用
在 Project(項目)菜單上單擊 Add Reference(添加引用)
在 COM 選項卡上選擇 Microsoft Scripting Runtime(Microsoft 腳本運行時)單擊 Select(選擇)然後單擊 OK(確定)
現在FSO 將顯示在 Object Browser(對象浏覽器)中的 InteropScripting 節點內
使用 FileSystemObject 進行編程
使用 CreateObject 方法創建一個 FileSystemObject 對象
將一個變量定義為 FileSystemObject 對象例如
Dim MyFileStream as ScriptingNew FileSystemObject
對新創建的對象使用相應的方法
訪問對象的屬性
代碼示例
以下示例使用 FileSystemObject 對象的實例來讀取文件並寫入文件內容
Public Class UsesScripting
Public Shared Sub Main()
Dim fileSystem As New ScriptingFileSystemObject()
Dim file As ScriptingTextStream
file = fileSystemOpenTextFile(c:\testtxt _
ScriptingIOModeForReading False_
ScriptingTristateTristateUseDefault)
Dim contents As String = fileReadAll()
ConsoleWriteLine(contents)
fileClose()
End Sub
End Class
框架類
SystemIO 命名空間包含 File 和 Directory 類它們可以提供操縱文件和目錄所需的基本功能由於所有方法都是靜態的或是這些對象的共享成員因此您可以直接使用它們而無需先創建類的實例
下表列出了 File 類方法
方法 |
說明 |
AppendText
創建 StreamWriter 的一個實例
將 UTF
編碼文本附加到現有文件
Copy
將現有文件復制到新文件
Create
以指定的完全限定路徑創建文件
CreateText
創建或打開一個新文件
用於編寫 UTF
編碼文本
Delete
刪除指定文件
Exists
返回 Boolean 值
表明指定文件是否存在
GetAttributes
返回完全限定路徑的文件的 FileAttributes
GetCreationTime
返回 Date
表示指定文件的創建時間
GetLastAccessTime
返回 Date
表示最近一次訪問指定文件的時間
GetLastWriteTime
返回 Date
表示最近一次寫入指定文件的時間
Move
將指定文件移到新位置
提供選項以指定新的文件名
Open
打開指定路徑的 FileStream
OpenRead
打開現有文件以進行讀取
OpenText
打開現有的 UTF
編碼文本文件以進行讀取
OpenWrite
打開現有文件以進行寫入
SetAttributes
設置指定路徑中的文件的指定 FileAttributes
SetCreationTime
設置指定文件的創建日期和時間
SetlastAccessTime
設置最近一次訪問指定文件的日期和時間
SetLastWriteTime
設置最近一次寫入指定文件的日期和時間
下表列出了附加到 Directory 類的方法
方法 |
說明 |
CreateDirectory
按 path 的規定創建所有目錄和子目錄
Delete
刪除指定目錄
Exists
返回 Boolean 值
表明指定目錄是否存在
GetCreationTime
返回 Date
表示指定目錄的創建時間
GetCurrentDirectory
返回 String
表示應用程序的當前工作目錄
GetDirectories
返回 String
表示指定目錄中的子目錄名稱
GetDirectoryRoot
返回 String
表示指定路徑的卷信息
根信息或同時表示這兩種信息
GetFiles
返回 String
表示指定目錄中的文件名
GetFileSystemEntries
返回 String
表示指定目錄中所有文件和子目錄的名稱
GetLastAccessTime
返回最近一次訪問指定目錄的日期和時間
GetLastWriteTime
返回 Date
表示最近一次寫入指定目錄的時間
GetLogicalDrives
返回 String
表示計算機的邏輯驅動器的名稱
GetParent
返回 String
表示指定路徑的父目錄
Move
將目錄及其內容移到新位置
SetCreationTime
設置指定目錄的創建日期和時間
SetCurrentDirectory
將應用程序的當前工作目錄設置為指定目錄
SetLastAccessTime
設置最近一次訪問指定目錄的日期和時間
SetLastWriteTime
設置最近一次寫入指定目錄的日期和時間
優點和缺點
公共語言運行時能夠生成豐富的類庫例如除基本文件 I/O 外SystemIO 命名空間還提供許多服務如 FileSystemWatcher 類允許您監視對文件的更改以及 FileInfo 和 DirectoryInfo 類使您可以收集有關指定文件或目錄的信息有關詳細信息請參閱 FileSystemWatcherFileInfo 和 DirectoryInfo
同樣公共語言運行時也提供 FileIOPermission 類允許您控制對文件和目錄的訪問這對於使用 Web 窗體的開發人員尤為重要因為默認情況下Web 窗體在一個名為 ASPNET 的特定本地用戶環境中運行而 ASPNET 是作為 ASPNET/框架安裝的一部分而創建的當此類應用程序請求訪問資源時此請求在該用戶的環境中進行不過在默認情況下ASPNET 用戶只擁有有限的權限使他們無法執行從 Web 應用程序寫入文件等操作
公共語言運行時也能夠與其他 NET 語言兼容(如 Visual C#?)並有助於保持應用程序之間的一致性這一點對於企業級的開發尤為重要
對於剛剛開始熟悉這些新方法的 Visual Basic 程序員而言不熟悉公共語言運行時可能會遇到一些困難如果您是其中一員您可能更傾向於使用您所熟知的方法
實現方法
如上所述許多 框架類(如 FileIOPermission)對於使用文件和目錄進行工作的 Visual Basic 開發人員都十分有用Imports 語句允許您在不使用完全限定名稱的情況下引用命名空間中的類
代碼示例
以下示例使用 StreamReader 類來讀取文本文件的內容
Imports System
Imports SystemIO
Function ReadTextFile(ByVal path As String) As String
Dim sr As SystemIOStreamReader
Dim Contents As String
sr = New StreamReader(path)
Contents = srReadToEnd()
srClose()
Return Contents
End Function
以下代碼與前面的示例順序相反它使用與 StreamWriter 類相同的方法來寫入文本文件
Imports System
Imports SystemIO
Sub WriteTextFile(ByVal path As String ByVal value As String)
Dim sr As StreamWriter
Dim Contents As String
sr = New StreamWriter(path)
srWrite(value)
srClose()
End Sub
以下示例演示了如何使用 FileSystemWatcher 類來監視目錄的變化它聲明 FileSystemWatcher 類的一個實例提供要監視的路徑指示要監視的內容然後創建一個事件處理程序來監視新文件的創建
Imports System
Imports SystemIO
Imports SystemXML
Imports SystemXMLSerialization
Class WatchForNewFiles
Shared Sub Main()
Dim fw As New SystemIOFileSystemWatcher()
要監視的路徑
fwPath = C:\
監視文件
fwNotifyFilter = SystemIONotifyFiltersFileName
fwIncludeSubdirectories = True
添加事件處理程序以監視文件創建
AddHandler fwCreated _
New SystemIOFileSystemEventHandler(AddressOf OnFileEvent)
fwEnableRaisingEvents = True
ConsoleReadLine()
End Sub
新文件創建時生成的事件
Shared Sub OnFileEvent(ByVal source As Object ByVal e As _
SystemIOFileSystemEventArgs)
ConsoleWriteLine(在 C: 中創建的新文件 & eFullPath)
End Sub
End Class
以下示例說明了如何使用公共語言運行時類來保存 Visual Basic NET 類可以使用 BinaryFormatter 和 BinaryWriter/Binary Reader 類來保存使用這種方法效率較高但可讀性略差也可以使用 XMLSerializer 類和 FileStream 類使用這種方法移植性較強且易於讀取但效率較低
Imports System
Imports SystemIO
Imports SystemXml
Imports SystemXmlSerialization
Public Module Module
Public Class class
Public classvar As Integer
End Class
Sub Main()
Try
Dim Result As Object
創建並初始化要保存的類(序列化)
Dim myclass As New class()
myclassclassvar =
創建序列化程序
Dim xs As New XmlSerializer(GetType(class))
創建文件流
Dim FStream As New IOFileStream(c:\xyztxt _
IOFileModeOpenOrCreate)
使用序列化程序編寫類
xsSerialize(FStream myclass)
將文件流的位置重置到開始位置
Fstreamseek( IOSeekOriginBegin)
通過還原序列化到對象中來完成在類中的讀取操作
Result = xsDeserialize(FStream)
FStreamClose()
將文件流作為文本打開以 XML 格式讀取/打印類
consoleWriteLine(readxml())
Catch e As Exception
consoleWriteLine(eToString)
End Try
End Sub
Function ReadXML() As String
Dim MyReader As StreamReader = FileOpenText(c:\xyztxt)
Dim str As String
Dim al As ArrayList = New ArrayList()
Do
str = MyReaderReadLine()
If str <> Nothing Then
ReadXML &= str & VBcrlf
End If
Loop Until str = Nothing
Return ReadXML
End Function
End Module
總結
在這些方法中不管是使用 Visual Basic NET 運行時方法采用 FileSystemObject 對象還是使用 NET 框架函數根據不同的情況和應用程序每種方法都各有利弊對於需要處理大型文件的應用程序而言使用公共語言運行時函數要比使用 FSO 方法好對於要與在早期版本中 Visual Basic 編寫的應用程序進行交互的應用程序而言使用 Visual Basic 運行時方法可以達到更佳性能在每種情況下您都需要評估應用程序的需求運行環境以及您駕馭不同方法的能力
正如您所看到的從早期版本至今Visual Basic 不斷展示出新的功能程序員的視野也不斷得到擴大對於大多數人來說最好是將這些方法結合起來從而可以根據應用程序的特定需要來選擇不同的方法您既可以繼續使用熟悉的方法也可以進一步探索新方法
From:http://tw.wingwit.com/Article/program/net/201311/12902.html