VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > VBnet >
  • vb.net教程之在Visual Basic .NET中文件I/O選項

  • 2017-06-07 13:55 來源:未知
有經驗的 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 中的文件方法

  讓我們先看看 Microsoft.VisualBasic 命名空間,這可以為那些被全新的 .NET 領域嚇壞的開發人員帶來一些安慰和信心。命名空間包含許多熟悉的函數和方法。除了部分名稱有少許改動外,大部分名稱仍保持不變,如 Dir、Input、Print、Seek、Write 等等。

  在選擇運行時函數時,主要應考慮寫入文件或從文件中收集的信息的類型。Visual Basic .NET 為三種類型的文件提供了訪問方法,每種方法適用于一種特定的數據類型:二進制、順序和隨機。

  二進制訪問,允許您以任意方式存儲和訪問數據,這種方法對于變長字段尤為有用。

  隨機訪問,允許您以記錄的方式存儲和訪問信息,這種方法假定記錄是等長的。順序訪問,允許您在文本文件中讀取和寫入字符串。

  這些不同類型的文件訪問所使用的函數發生了一些變化。最顯著的變化是用 FilePut/FilePutObject 和 FileGet/FileGetObject 函數代替 Put 和 Get 函數。在 Visual Basic .NET 中,FilePut 和 FileGet 映射到 Put 和 Get 函數;FilePutObject 和 FileGetObject 用于將 Object 類型(等價于 Visual Basic 早期版本中的 Variant 類型)的對象寫入文件。

例如,下面是 Visual Basic 6.0 的代碼:

  Dim Person As Variant
  If IdentifyPeopleByName Then
   Person = "我的姓名 1"
  Else
   Person = 564
  EndIf
  Put #1, , Person
在 Visual Basic .NET 中變為:

 FileOpen(1, "c:\test.txt", OpenMode.Binary)
 Dim Person As Object
 If IdentifyPeopleByName Then
   Person = "我的姓名 1"
 Else
   Person = 564
 EndIf
  FilePutObject(1, Person)
 FileClose(1)


  總之,對于有經驗的 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 Basic .NET 函數還提供二進制文件訪問,為使用變長字段時提供了更好的選擇,而 FileSystemObject 對象(將在下一節介紹)則沒有此功能。 
 

  最后一點,在從 Visual Basic .NET 中使用 Visual Basic .NET 內置文件 I/O 函數時,沒有需要特別注意的事項(如需要導入命名空間)。

  Visual Basic .NET 文件 I/O 函數僅支持 String、Date、Integer、Long、Single、Double 和 Decimal 寫入類型以及這些類型的結構和數組,這是使用這些函數時的一個缺點。此外,不能將類序列化,因此,在這些情況下直接使用 System.IO 類性能可能會更佳。

  代碼示例

  如以下各例所示,使用 Visual Basic 運行時方法進行文件和目錄操作是開發人員所熟悉的。

  以下示例將檢查文件是否存在,如果存在,則使用 FileCopy 函數將其復制到新文件。

Private Sub CopyFiles()
 Dim checkFile As String
 checkFile = Dir$("c:\test.txt")
 If checkFile = "test.txt"
   FileCopy "c:\test.txt", "c:\new.txt"
 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(1, "C:\TESTFILE.txt", OpenMode.Binary)
 For RecordNumber = 1 To 3 ' 循環 3 次。
   MyRecord.OrderNumber = RecordNumber     ' 定義 OrderNumber。
   MyRecord.OrderDate = RecordDate       ' 定義 OrderDate。
   MyRecord.Name = "我的姓名" & RecordNumber  ' 創建字符串。
   FilePut(1, MyRecord)            ' 將記錄寫入文件。
  Next RecordNumber
 FileClose(1)
End Sub
FileSystemObject


  與 Microsoft.VisualBasic 命名空間提供的函數和方法類似,Visual Basic 早期版本的用戶也應當熟悉 FileSystemObject 對象。在 Visual Basic .NET 中仍然可以使用此對象。

  FileSystemObject (FSO) 模型將文件、目錄和驅動器表示為 COM 對象,每個對象都有自己的屬性和方法。您可以創建和操縱這些對象,并使用這些對象的屬性來查找信息,如目錄內容、文件大小、對象的創建時間等等。通過創建和訪問 FileSystemObject 對象的實例,可以訪問表示系統文件、目錄和驅動器的對象。

  FSO 對象模型位于 Microsoft 腳本運行時類型庫 (Scrrun.dll) 中,支持通過 TextStream 對象創建和操縱文本文件。有關詳細信息,請參閱 TextStream。FileStream 類圍繞文件提供一個數據流,允許對文件系統進行同步或異步讀寫操作以及緩沖輸入和輸出,以改善性能。信息被寫入緩沖區,只有當緩沖區已滿或調用 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(對象瀏覽器)中的 Interop.Scripting 節點內。

  使用 FileSystemObject 進行編程:

  使用 CreateObject 方法創建一個 FileSystemObject 對象。

  將一個變量定義為 FileSystemObject 對象。例如:

Dim MyFileStream as Scripting.New FileSystemObject。 

  對新創建的對象使用相應的方法。

  訪問對象的屬性。

  代碼示例

  以下示例使用 FileSystemObject 對象的實例來讀取文件并寫入文件內容。

Public Class UsesScripting
 Public Shared Sub Main()
   Dim fileSystem As New Scripting.FileSystemObject()
   Dim file As Scripting.TextStream
   file = fileSystem.OpenTextFile("c:\test.txt", _
   Scripting.IOMode.ForReading, False,_
   Scripting.Tristate.TristateUseDefault)
   Dim contents As String = file.ReadAll()
   Console.WriteLine(contents)
   file.Close()
 End Sub

End Class




  .NET 框架類

  System.IO 命名空間包含 File 和 Directory 類,它們可以提供操縱文件和目錄所需的基本功能。由于所有方法都是靜態的或是這些對象的共享成員,因此您可以直接使用它們,而無需先創建類的實例。

下表列出了 File 類方法。

方法 說明 
AppendText 創建 StreamWriter 的一個實例,將 UTF-8 編碼文本附加到現有文件。 
Copy 將現有文件復制到新文件。 
Create 以指定的完全限定路徑創建文件。 
CreateText 創建或打開一個新文件,用于編寫 UTF-8 編碼文本。 
Delete 刪除指定文件。 
Exists 返回 Boolean 值,表明指定文件是否存在。 
GetAttributes 返回完全限定路徑的文件的 FileAttributes。 
GetCreationTime 返回 Date,表示指定文件的創建時間。 
GetLastAccessTime 返回 Date,表示最近一次訪問指定文件的時間。 
GetLastWriteTime 返回 Date,表示最近一次寫入指定文件的時間。 
Move 將指定文件移到新位置,提供選項以指定新的文件名。 
Open 打開指定路徑的 FileStream。 
OpenRead 打開現有文件以進行讀取。 
OpenText 打開現有的 UTF-8 編碼文本文件以進行讀取。 
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 外,System.IO 命名空間還提供許多服務,如 FileSystemWatcher 類,允許您監視對文件的更改;以及 FileInfo 和 DirectoryInfo 類,使您可以收集有關指定文件或目錄的信息。有關詳細信息,請參閱 FileSystemWatcher、FileInfo 和 DirectoryInfo。

  同樣,公共語言運行時也提供 FileIOPermission 類,允許您控制對文件和目錄的訪問。這對于使用 Web 窗體的開發人員尤為重要,因為默認情況下,Web 窗體在一個名為 ASPNET 的特定本地用戶環境中運行,而 ASPNET 是作為 ASP.NET/框架安裝的一部分而創建的。當此類應用程序請求訪問資源時,此請求在該用戶的環境中進行。不過,在默認情況下,ASPNET 用戶只擁有有限的權限,使他們無法執行從 Web 應用程序寫入文件等操作。

  公共語言運行時也能夠與其他 .NET 語言兼容(如 Visual C#?),并有助于保持應用程序之間的一致性,這一點對于企業級的開發尤為重要。

  對于剛剛開始熟悉這些新方法的 Visual Basic 程序員而言,不熟悉公共語言運行時可能會遇到一些困難。如果您是其中一員,您可能更傾向于使用您所熟知的方法。 
 

  實現方法

  如上所述,許多 .NET 框架類(如 FileIOPermission)對于使用文件和目錄進行工作的 Visual Basic 開發人員都十分有用。Imports 語句允許您在不使用完全限定名稱的情況下引用命名空間中的類。

  代碼示例

  以下示例使用 StreamReader 類來讀取文本文件的內容。

Imports System
Imports System.IO
Function ReadTextFile(ByVal path As String) As String
 Dim sr As System.IO.StreamReader
 Dim Contents As String
 sr = New StreamReader(path)
 Contents = sr.ReadToEnd()
 sr.Close()
 Return Contents
End Function 

以下代碼與前面的示例順序相反,它使用與 StreamWriter 類相同的方法來寫入文本文件。

Imports System
Imports System.IO
Sub WriteTextFile(ByVal path As String, ByVal value As String)
Dim sr As StreamWriter
Dim Contents As String
 sr = New StreamWriter(path)
 sr.Write(value)
 sr.Close()
End Sub 

  以下示例演示了如何使用 FileSystemWatcher 類來監視目錄的變化。它聲明 FileSystemWatcher 類的一個實例,提供要監視的路徑,指示要監視的內容,然后創建一個事件處理程序來監視新文件的創建。

Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization
Class WatchForNewFiles

  Shared Sub Main()
   Dim fw As New System.IO.FileSystemWatcher()
   ' 要監視的路徑。
   fw.Path = "C:\"

   ' 監視文件。
   fw.NotifyFilter = System.IO.NotifyFilters.FileName
   fw.IncludeSubdirectories = True

   ' 添加事件處理程序以監視文件創建。
   AddHandler fw.Created, _
    New System.IO.FileSystemEventHandler(AddressOf OnFileEvent)
   fw.EnableRaisingEvents = True
   Console.ReadLine()
  End Sub


' 新文件創建時生成的事件。
  Shared Sub OnFileEvent(ByVal source As Object, ByVal e As _
   System.IO.FileSystemEventArgs)
   Console.WriteLine("在 C: 中創建的新文件" & e.FullPath)
  End Sub

End Class


  以下示例說明了如何使用公共語言運行時類來保存 Visual Basic .NET 類??梢允褂?BinaryFormatter 和 BinaryWriter/Binary Reader 類來保存,使用這種方法效率較高,但可讀性略差。也可以使用 XMLSerializer 類和 FileStream 類,使用這種方法,移植性較強且易于讀取,但效率較低。

Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization
Public Module Module1
  Public Class class1
    Public classvar As Integer
  End Class

  Sub Main()
    Try
      Dim Result As Object
      ' 創建并初始化要保存的類(序列化)。
      Dim myclass1 As New class1()
      myclass1.classvar = 7
      ' 創建序列化程序。
      Dim xs As New XmlSerializer(GetType(class1))
      ' 創建文件流。
      Dim FStream As New IO.FileStream("c:\xyz.txt", _
      IO.FileMode.OpenOrCreate)
      ' 使用序列化程序編寫類。
      xs.Serialize(FStream, myclass1)
      ' 將文件流的位置重置到開始位置。
      Fstream.seek(0, IO.SeekOrigin.Begin)
      ' 通過還原序列化到對象中來完成在類中的讀取操作。
      Result = xs.Deserialize(FStream)
      FStream.Close()

      ' 將文件流作為文本打開,以 XML 格式讀取/打印類。
      console.WriteLine(readxml())

    Catch e As Exception
      console.WriteLine(e.ToString)
    End Try
  End Sub

  Function ReadXML() As String
    Dim MyReader As StreamReader = File.OpenText("c:\xyz.txt")
    Dim str As String
    Dim al As ArrayList = New ArrayList()

    Do
      str = MyReader.ReadLine()
      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 不斷展示出新的功能,程序員的視野也不斷得到擴大。對于大多數人來說,最好是將這些方法結合起來,從而可以根據應用程序的特定需要來選擇不同的方法。您既可以繼續使用熟悉的方法,也可以進一步探索新方法。

本欄文章均來自于互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用于商業或者其他目的。

相關教程