第15章 文件处理技术 变量和数组只能临时存储数据,且数据量很小, 当应用程序终止,数据就会丢失。如果需要将数 据长期存储或者存储大量数据,就需要用到文件。 文件维护的数据通常称为持久数据,存储在计算 机的辅助存储设备中,如磁盘、光盘等。许多程 序都要与外部数据进行交互,如数据库、XML,甚 至文本文件,因此文件操作是软件开发中必不可 少的任务。对于程序设计语言来说,文件处理也 是最重要的能力之一。只有通过文件处理,语言 才能支持需要处理大量持久数据的大型应用程序 开发。本章介绍VB.NET中的强大丰富的文件处理 技术。
章节内容 15.1 文件概述 15.2 System.IO名称空间 15.3 My.Computer.FileSystem对象 15.1 文件概述 15.2 System.IO名称空间 15.3 My.Computer.FileSystem对象 15.4 实例:图片浏览器程序
15.1 文件概述 文件是存储在某种介质上数据的集合, 就其本身来讲,文件就是磁盘上的一系 列相关的数据字节。 15.1 文件概述 文件是存储在某种介质上数据的集合, 就其本身来讲,文件就是磁盘上的一系 列相关的数据字节。 VB.NET中将文件视为一个顺序字节的流 ,其结构如所示。每个文件都结束于一 个EOF(End Of File文件尾)标记。 需要注意的是,文件和文件流并不是相 同的概念。
3种类型的文件访问 顺序方式,用于在连续的块中读取和写 入文本文件。 随机方式,用于读取和写入结构为固定 长度记录的文本或二进制文件。 二进制方式,用于读取和写入任意结构 的文件。
VB.NET中的3种文件操作方法 第一种是使用Visual Basic运行时函数 进行文件访问(VB传统方式直接文件访 问)。 第二种是通过.Net中的System.IO模型 访问。 第三种是通过文件系统对象模型FSO访 问。
15.2 System.IO名称空间 在VB.Net中与文件操作有关的类都集中 在System.IO名称空间中。图15-1是此 名称空间的类图,其中包含了很多用于 文件处理的类。 要使用这些类的话,需要在项目中引入 该名称空间。 Imports System.IO
15.2.1 文件与目录操作 File类提供文件典型操作的共享方法, 如复制、移动、重命名、创建、打开、 删除和追加到文件等,而FileInfo类则 提供相同功能的实例方法。 方法 说明 Copy( ) 将文件从源位置复制到目标位置 Create( ) 在规定的路径上创建文件 Delete( ) 删除文件 Open( ) 在规定的路径上返回FileStream对象 Move( ) 将规定的文件移动到新位置。可以在新位置为文件规定不同的名称
File类中的方法都是共享方法,可以直 接由类名来引用。 而FileInfo类则需要先实例化,然后通 过对象吗引用其方法。
类似的,Directory类和DirectoryInfo 类也具有类似的关系。二者均提供目录 的典型操作,如创建、删除、移动、获 取当前目录和文件等。区别在于, Directory类提供共享方法,而 DirectoryInfo类提供实例方法。 方法 说明 CreateDirectory( ) 创建具有规定路径的目录 Delete( ) 删除规定的目录以及其中的所有文件 GetDirectories( ) 返回表示当前目录下的目录名的string对象数组 GetFiles( ) 返回在当前目录中的文件名的string对象数组 GetFilesSystemEntries( ) 返回在当前目录中的文件和目录名的string对象数组 Move( ) 将规定的目录移动到新位置。可以在新位置为文件夹规定一个新名称
15.2.2 文件的流操作 流提供一种向文件写入字节和从文件中 读取字节的方式。VB.NET将文件视为一 个字节流。要对文件进行读写操作,就 需要使用流。
三种基本流操作 从流读取。读取是从流到数据结构(如 字节数组)的数据传输。 向流写入。写入是从数据源到流的数据 传输。 查找。查找是对流内的当前位置进行的 查询和修改。
文本文件的流操作:StreamReader和StreamWriter类 StreamReader和StreamWriter类使用特 定的编码从字节流中读取字符和往字节 流中写入字符。其默认编码为UTF-8。 这两个类在使用之前需要实例化,通常 使用打开文件或创建文件的操作来获取 该类的实例。
二进制文件的流操作: BinaryReader和BinaryWriter类 下面代码实现向二进制文件写入1到10的数字。 1 ' 写入二进制文件 2 Dim filename As String = "c:\file.bin" ' 文件路径 3 ' 如果文件存在就先删除,否则新文件就不能创建 4 If (File.Exists(filename)) Then 5 File.Delete(filename) 6 End If 7 ' 创建文件流,新建方式 8 Dim fs As New FileStream(filename, FileMode.CreateNew) 9 ' 以二进制方式写文件 10 Dim bw As New BinaryWriter(fs) 11 For i = 0 To 9 12 bw.Write(i) 13 Next 14 bw.Close( ) 15 fs.Close( )
下面代码使用StreamWriter类向文本文件写入内容。 1 ' 写入文本文件 2 Dim path As String = "c:\test.txt" ' 文件全路径 3 Dim sw As New StreamWriter(path) 4 sw.Write("今天是: ") 5 sw.WriteLine(DateTime.Now) 6 sw.Close( )
下面这段代码就是将上小节创建的二进制文件读取并显示出来。 1 ' 读取二进制文件 2 Dim filename As String = "c:\file.bin" ' 文件路径 3 ' 创建文件流,打开读取 4 Dim fs As New FileStream(filename, FileMode.Open, FileAccess.Read) 5 ' 从二进制文件中读取整数 6 Dim br As New BinaryReader(fs) 7 For i = 0 To 9 8 Console.WriteLine(br.ReadInt32( )) 9 Next 10br.Close( ) 11fs.Close( )
15.3 My.Computer.FileSystem对象 属性 说 明 CurrentDirectory 获取或设置当前目录 Drives 获取或设置有关驱动器的信息 SpecialDirectories 返回My.Computer.FileSystem.SpecialDirectories对象,它可用于访问特殊的目录,如Temp或MyDocuments等
返回一个 Boolean,指示文件是否存在 文件操作 方法 说明 CopyFile 复制文件 DeleteFile 删除文件 FileExists 返回一个 Boolean,指示文件是否存在 GetFileInfo 返回指定路径的 FileInfo 对象 MoveFile 移动文件 RenameFile 重命名文件
文件读写 方法 说明 OpenTextFieldParser 打开TextFieldParser OpenTextFileReader 打开TextReader OpenTextFileWriter 打开TextWriter ReadAllBytes 从二进制文件中读取 ReadAllText 从文本文件中读取 WriteAllBytes 写入到二进制文件 WriteAllText 写入到文本文件
目录操作 方法 说明 CombinePath 以String形式返回格式正确的组合路径 CopyDirectory 复制目录 CreateDirectory 创建目录 DeleteDirectory 删除目录 DirectoryExists 返回一个Boolean指示目录是否存在 FindInFiles 返回字符串的只读集合,这些字符串表示包含指定文本的文件的名称 GetDirectories 返回一个String集合,该集合表示一个目录中的子目录的路径名称 GetDirectoryInfo 返回指定路径的DirectoryInfo对象 GetDriveInfo 返回指定路径的DriveInfo对象 GetFiles 返回一个只读String集合,该集合表示一个目录中的文件的名称。 GetParentPath 返回一个String,它表示所提供路径的父级绝对路径 MoveDirectory 移动目录 RenameDirectory 重命名目录
15.4 实例:图片浏览器程序