读写文件(二进制文件、文本文件、ini文件)
1. 文件和流
文件(file)和流(stream)即有区别又有联系。文件是在各种媒质上(可移动磁盘、硬盘、CD 等)永久存储的数据的有序集合。它是一种进行数据读写操作的基本对象。通常情况下,文件按照树状目录进行组织,每个文件都有文件名、文件所在路径、创建时间、访问权限等属性。
1) 流是字节序列的抽象概念,如文件、输入输出设备、内部进程通信管道或者TCP/IP套接字等均可以看成流。流提供一种向后备存储器写入字节和从后备存储器读取字节的方式。
2) 除了和磁盘文件直接相关的文件流以外,还有多种其它类型的流,如分布在网络中、内存中和磁带中的流,分别称为网络流、内存流和磁带流。
3) 所有表示流的类都是从抽象基类Stream继承的。
流的操作有三类:
A. 读取:从流中读取数据到变量中。
B. 写入:把变量中的数据写入到流中。
C. 定位:重新设置流的当前位置,以便随机读写。
File类的静态方法主要是用于创建FileStream类。一个FileStream类的实例实际上代表一个磁盘文件,使用FileStream类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其它与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream对输入输出进行缓冲,从而提高了系统的性能。
图1 与流相关类层次结构
对于文件的读写,最常用的类如下:
A. FileStream(文件流):这个类主要用于在二进制文件中读写二进制数据——也可以读写任何文件。
B. StreamReader(流读取器)和StreamWriter(流写入器):这两个类是专门用于读写文本文件的。
C. BinaryReader和BinaryWrite:这两个类本身不执行流,而是提供其他对象的包装器以及对二进制数据进行额外的格式化。
2. 文件的基本操作
2.1. 二进制文件
2.1.1. 打开
读写二进制数据通常使用FileStream类。要构造其实例,需要以下4条信息:
A. 要访问的文件。
B. 表示如何打开文件的模式——指定在文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容。
C. 表示访问文件的方式——对文件执行的操作(只读、只写或者读写)。
D. 共享访问——其它线程所具有的对该文件的访问类型(独占文件、共享读或者共享写)。
打开指定路径上的FileStream,可以使用File类的Open方法或OpenRead方法或OpenText方法。
其中Open打开文件的方式有三种,如下表所示:
名称 |
说明 |
File.Open (String, FileMode) |
打开指定路径上的 FileStream,具有读/写访问权限。 |
File.Open (String, FileMode, FileAccess) |
以指定的模式和访问权限打开指定路径上的 FileStream。 |
File.Open (String, FileMode, FileAccess, FileShare) |
打开指定路径上的 FileStream,具有指定的读、写或读/写访问模式以及指定的共享选项。 |
FileStream(String, FileMode, FileAccess) 等各种FileStream构造函数 |
FileStream构造函数与file.Open打开效果一致。 |
FileAccess默认值为FileAccess.ReadWrite,FileShare默认值为FileShare.Read。
文件操作方式说明(.Net2.0 SDK定义):
public enum FileMode // 指定操作系统打开文件的方式
{
// 指定操作系统应创建新文件。此操作需要FileIOPermissionAccess.Write权限如果文件已存在,
// 则将引发System.IO.IOException
CreateNew = 1,
// 指定操作系统应创建新文件。如果文件已存在,它将被改写。这要求FileIOPermissionAccess.Write权限。
// System.IO.FileMode.Create等效于这样的请求:如果文件不存在,则使用 FileMode.CreateNew;
// 否则使用FileMode.Truncate
Create = 2,
// 指定操作系统应打开现有文件。打开文件的能力取决于 System.IO.FileAccess 所指定的值。
// 如果该文件不存在,则引发 System.IO.FileNotFoundException
Open = 3,
// 指定操作系统应打开文件(如果文件存在);否则,应创建新文件。如果用 FileAccess.Read 打开文件,
// 则需要 System.Security.Permissions.FileIOPermissionAccess.Read。如果文件访问为FileAccess.Write 或
// FileAccess.ReadWrite,则需要 System.Security.Permissions.