熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

在Visual Basic .NET中文件I/O選項

2013-11-15 14:18:43  來源: ASP編程 
 有經驗的 Visual Basic 開發人員最初可能會認為Visual Basic NET 中的變化使本來已經熟悉的領域變得陌生而難以駕馭其實過去開發的成果仍然可以使用例如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 變量 GetAttr 返回 FileAttribute 值表示文件文件夾或目錄的屬性 Input 從打開的順序文件讀取數據並將該數據分配給變量 InputString 返回 String 值包含在 Input 或 Binary 模式下打開的文件中的字符 LineInput 從打開的順序文件中讀取一行並將其分配給 String 變量 Loc 返回 Long 值指定在打開的文件中的當前讀/寫位置 LOF 返回 Long 值表示使用 FileOpen 函數打開的文件的大小(字節) Print 將顯示格式的數據寫入順序文件 PrintLine 將顯示格式的數據寫入順序文件並以回車符結束 Seek 返回 Long 值指定在使用 FileOpen 函數打開的文件中的當前讀/寫位置或為使用 FileOpen 函數打開的文件中的下一個讀/寫操作設置位置 SetAttr 設置文件的屬性信息如 ReadOnlyHiddenDirectoryArchive 等等 Write 將數據寫入順序文件通常使用 Input 函數從文件中讀取使用 Write 函數寫入的數據 WriteLine 將數據寫入順序文件並以回車符結束

  優點和缺點

  Visual Basic NET 運行時提供的函數有兩個主要優點即為開發人員所熟悉並且易於使用Visual Basic NET 的核心功能仍然保留其為人所熟悉直觀和靈活的特點同時提供了舒適的 NET 開發環境

  同樣將在 Visual Basic 早期版本中編寫的程序升級到 NET或者創建能夠與在 Visual Basic 早期版本中編寫的應用程序正常交互的應用程序也相對簡單

 Visual Basic NET 函數還提供二進制文件訪問為使用變長字段時提供了更好的選擇而 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


  NET 框架類

  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 程序員而言不熟悉公共語言運行時可能會遇到一些困難如果您是其中一員您可能更傾向於使用您所熟知的方法
 

  實現方法

  如上所述許多 NET 框架類(如 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/ASP/201311/21901.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.