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

来源:岁月联盟 编辑:zhu 时间:2003-07-12
在 Visual Basic .NET 中选择文件 I/O 选项
Cat Francis
Visual Studio Team
Microsoft Corporation
2002 年 4 月

摘要:本文是针对 Visual Basic 程序员而写的,他们可能会搞不清 Visual Basic .NET 中的多种文件 I/O 访问方法。可用的方法包括 Visual Basic .NET 运行时提供的方法、FileSystemObject 以及公共语言运行时提供的方法。阅读完本文后,有经验的开发人员将很快熟悉这三种方法,并且可以得心应手地从中进行选择。本文包含一些指向英文站点的链接。

目录
简介
Visual Basic .NET 中的文件方法
Visual Basic .NET 中的 FileSystemObject
公共语言运行时文件方法
总结
简介
有经验的 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 为三种类型的文件提供了访问方法,每种方法适用于一种特定的数据类型:二进制、顺序和随机。

二进制访问,允许您以任意方式存储和访问数据,这种方法对于变长字段尤为有用。
随机访问,允许您以记录的方式存储和访问信息,这种方法假定记录是等长的。
顺序访问,允许您在文本文件中读取和写入字符串。
有关详细信息,请参阅 Data Access Functions。

这些不同类型的文件访问所使用的函数发生了一些变化。最显著的变化是用 FilePut/FilePutObject 和 FileGet/FileGetObject 函数代替 Put 和 Get 函数。在 Visual Basic .NET 中,FilePut 和 FileGet 映射到 Put 和 Get 函数;FilePutObject 和 FileGetObject 用于将 Object 类型(等价于 Visual Basic 早期版本中的 Variant 类型)的对象写入文件。有关详细信息,请参阅 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 早期版本中编写的应用程序正常交互的应用程序,也相对简单。有关早期版本代码升级的详细信息,请参阅 Preparing a Visual Basic 6.0 Application for Upgrading。

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 方法时,缓冲区中的内容才会被写入文件。有关详细信息,请参阅 FileStream。

优点和缺点
FSO 的主要优点是,它可以将许多文件 I/O 函数集合到单个对象中。通过创建该对象的实例,可以访问对象的方法和属性。

下表列出了 FSO 对象模型的基本组件,并提供了与相应主题对应的链接,这些主题列出了适用于创建和操纵文件、驱动器及目录的属性和方法。

对象 说明
FileSystemObject 创建与删除驱动器、文件夹和文件,获取其信息并对其进行常规操作。与此对象相关的许多方法都与其他对象中的相应方法相同。
Drive 获取关于连接到系统的驱动器的信息,如可用空间及其共享名称。
File 创建,删除或移动文件,以及在系统中查询文件的名称、路径和其他信息。
Folder 创建,删除或移动文件夹,以及在系统中查询文件夹的名称、路径和其他信息。
TextStream 读写文本文件。

FSO 对象模型也适用于线程。它提供了一个用于异步 I/O 的构造函数,如当使用 BeginRead 和 BeginWrite 方法时,该函数可使主线程继续,允许用户稍后再处理数据。多个 I/O 请求可以同时挂起。

但是,FSO 也有一些不足之处。如上所述,它只能对文本文件进行操作。要操纵二进制文件,您必须使用指针指向内存地址或字节数组,但 FSO 对象不支持此操作。

此外,当您读取或写入大量内容时,存储在缓冲区中的信息可能会产生很高的内存命中率。还有,您不能管理许可权限或文件和文件夹属性。