在 Visual Basic .NET 中选择文件 I/O 选项(微软)(二)

来源:岁月联盟 编辑:zhu 时间:2003-07-12
实现方法
可以使用 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 应用程序写入文件等操作。有关详细信息,请参阅 FileIOPermission。

公共语言运行时也能够与其他 .NET 语言兼容(如 Visual C#™),并有助于保持应用程序之间的一致性,这一点对于企业级的开发尤为重要。

对于刚刚开始熟悉这些新方法的 Visual Basic 程序员而言,不熟悉公共语言运行时可能会遇到一些困难。如果您是其中一员,您可能更倾向于使用您所熟知的方法。

实现方法
如上所述,许多 .NET 框架类(如 FileIOPermission)对于使用文件和目录进行工作的 Visual Basic 开发人员都十分有用。Imports 语句允许您在不使用完全限定名称的情况下引用命名空间中的类。有关详细信息,请参阅 System.IO.FileStream 和 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 不断展示出新的功能,程序员的视野也不断得到扩大。对于大多数人来说,最好是将这些方法结合起来,从而可以根据应用程序的特定需要来选择不同的方法。您既可以继续使用熟悉的方法,也可以进一步探索新方法。