1、第11章 文件操作,11.1 文件和System.IO模型概述 11.2 System.IO模型 11.3 文件夹和文件操作 11.4 FileStream类 11.5 文本文件的操作 11.6 二进制文件操作 11.7 序列化和反序列化,11.1 文件和System.IO模型概述,1.1.1 文件类型(1)按文件的存取方式及结构,文件可以分为顺序文件和随机文件(2)按文件数据的组织格式,文件可分为ASCII文件和二进制文件 1.1.2 文件的属性(1)文件属性:只读、隐藏和归档等类型。(2)访问方式:读、读/写和写等类型。(3)访问权限:读、写、追加数据等类型。(4)共享权限:文件共享、文件
2、不共享等类型。 11.1.3 文件访问方式在C#中可以通过.NET的System.IO模型以流的方式对各种数据文件进行访问。,11.2 System.IO模型,11.2.1 什么是System.IO模型System.IO模型提供了一个面向对象的方法来访问文件系统。System.IO模型提供了很多针对文件、文件夹的操作功能,特别是以流(Stream)的方式对各种数据进行访问,这种访问方式不但灵活,而且可以保证编程接口的统一。System.IO模型的实现包含在System.IO命名空间中,该命名空间包含允许读写文件和数据流的类型以及提供基本文件和文件夹支持的各种类,也就是说,System.IO模型
3、是一个文件操作类库,包含的类可用于文件的创建、读/写、复制、移动和删除等操作,其中最常用的类如表11.1所示。,11.2.2 文件编码文件编码也称为字符编码,用于指定在处理文本时如何表示字符。一种编码可能优于另一种编码,主要取决于它能处理或不能处理哪些语言字符,不过通常首选的是Unicode。表11.2列出了该类的属性及其对应文件编码方式。,11.2.3 C#的文件流C#将文件看成是顺序的字节流,也称为文件流。文件流是字节序列的抽象概念,文件可以看成是存储在磁盘上的一系列二进制字节信息。C#用文件流对其进行输入、输出操作,例如,读取文件信息、向文件写入信息。 C#提供Stream类(Syste
4、m.IO成员)是所有流的基类,由它派生出文件流FileStream和缓冲区流BufferedStream。,11.3 文件夹和文件操作11.3.1 文件夹操作Directory类提供了文件夹操作的方法,表11.3列出了Directory类的常用方法。Directory类内的方法是共享的,无须创建对象实体即可使用。,11.3.2 文件操作File类提供了文件操作的方法,并协助创建FileStream对象。File类的常用方法如表11.4所示。和Directory类一样,File类的方法是共享的,无须创建对象实体即可使用。,【例11.1】 设计一个窗体,显示指定目录中的所有文件的文件名、创建时间和
5、文件属性。,Form1,设计界面 事件过程: private void button1_Click(object sender, EventArgs e) int i; string filen; string filea;listBox1.Items.Clear();if (!Directory.Exists(textBox1.Text)MessageBox.Show(textBox1.Text + “文件夹不存在“,“信息提示“,MessageBoxButtons.OK);else filen = Directory.GetFiles(textBox1.Text);for (i = 0;
6、i = filen.Length - 1; i+) filea = String.Format(“0t1 2“,fileni, File.GetCreationTime(fileni),fileatt(fileni);listBox1.Items.Add(filea); ,private string fileatt(string filename) /获取文件属性 string fa=“;switch(File.GetAttributes(filename) case FileAttributes.Archive:fa=“存档“; break;case FileAttributes.Read
7、Only:fa=“只读“; break;case FileAttributes.Hidden:fa=“隐藏“; break;case FileAttributes.Archive | FileAttributes.ReadOnly:fa=“存档+只读“; break;case FileAttributes.Archive | FileAttributes.Hidden:fa=“存档+隐藏“; break;case FileAttributes.ReadOnly | FileAttributes.Hidden:fa=“只读+隐藏“; break;case FileAttributes.Archi
8、ve | FileAttributes.ReadOnly | FileAttributes.Hidden:fa=“存档+只读+隐藏“; break;return fa; ,运行界面,11.4 FileStream类使用FileStream类可以产生文件流,以便对文件进行读取、写入、打开和关闭操作。FileStream类提供的构造函数很多,最常用的构造函数如下:public FileStream(string path,FileMode mode)它使用指定的路径和创建模式初始化FileStream类的新实例。其中,path指出当前FileStream对象封装的文件的相对路径或绝对路径。mode
9、指定一个FileMode常数,确定如何打开或创建文件。FileMode常数的说明如表11.5所示。 FileStream类提供的常用方法如表11.6所示。,11.5 文本文件的操作文本文件的操作通过StreamReader和StreamWriter两个类提供的方法来实现的。 11.5.1 StreamReader类StreamReader类以一种特定的编码从字节流中读取字符,其常用的构造函数如下:,StreamReader(Stream):为指定的流初始化StreamReader类的新实例。 StreamReader(String):为指定的文件名初始化StreamReader类的新实例。 S
10、treamReader(Stream,Encoding):用指定的字符编码为指定的流初始化StreamReader类的一个新实例。 StreamReader(String,Encoding):用指定的字符编码,为指定的文件名初始化StreamReader类的一个新实例。,StreamReader类的常用的方法如表11.7所示。,使用Streamreader类读取数据的过程:首先通过File的OpenRead方法建立一个文件读取文件流,然后通过StreamReader类的方法将文件流中的数据读到C#编辑控件中(如文本框等)。,【例11.2】 设计一个窗体,在一个文本框中显示MyTest.txt文
11、件中的数据(假设该文件已存在,其中有3行文字)。,Form2,设计界面 事件过程: private void button1_Click(object sender, EventArgs e) string path = “H:MyTest.txt”; string mystr = “;FileStream fs = File.OpenRead(path);StreamReader sr = new StreamReader(fs, Encoding.Default );/指定打开文件fs.Seek(0, SeekOrigin.Begin); /将文件流指针定位在开始位置while (sr.P
12、eek() -1)mystr = mystr + sr.ReadLine() + “rn“; /rn表示回车换行sr.Close();fs.Close();textBox1.Text = mystr; ,运行界面,11.5.2 StreamWriter类StreamWriter类以一种特定的编码输出字符,其常用的构造函数如下:,StreamWriter(Stream):用UTF-8编码及默认缓冲区大小,为指定的流初始化StreamWriter类的一个新实例。StreamWriter(String):使用默认编码和缓冲区大小,为指定路径上的指定文件初始化StreamWriter类的新实例。Str
13、eamWriter(Stream,Encoding):用指定的编码及默认缓冲区大小,为指定的流初始化StreamWriter类的新实例。StreamWriter(string path,bool append):path表示要写入的完整文件路径。append表示确定是否将数据追加到文件。如果该文件存在,并且append为false,则该文件被改写;如果该文件存在,并且append为true,则数据被追加到该文件中。否则,将创建新文件。,StreamWriter类的常用的方法如表11.8所示。,使用StreamWriter类写入数据的过程:首先通过File类的OpenWrite建立一个写入文件流
14、,然后通过StreamWriter的Write/WriteLine方法将C#编辑控件中(如文本框等)中的数据写入到该文件流中。,例11.3】 设计一个窗体,用于将一个文本框中的数据写入到MyTest1.txt文件中,并在另一个文本框中显示这些数据。,Form3,设计界面 事件过程: using System; using System.IO; /引用System.IO命名空间,新增 using System.Text; using System.Windows.Forms; namespace Proj11_1 public partial class Form3 : Form string
15、path = “H:MyTest1.txt“; /文件名path作为Form3类的字段public Form3()InitializeComponent();,private void Form3_Load(object sender, EventArgs e) textBox1.Text = “;textBox2.Text = “;button1.Enabled = true;button2.Enabled = false;private void button1_Click(object sender, EventArgs e) if (File.Exists(path) /存在该文件时删
16、除之File.Delete(path);else FileStream fs = File.OpenWrite(path);StreamWriter sw = new StreamWriter(fs);sw.WriteLine(textBox1.Text);sw.Close();fs.Close();button2.Enabled = true;,private void button2_Click(object sender, EventArgs e) string mystr = “;FileStream fs = File.OpenRead(path);StreamReader sr =
17、 new StreamReader(fs);while (sr.Peek() -1)mystr = mystr + sr.ReadLine() + “rn“;sr.Close();fs.Close();textBox2.Text = mystr; ,11.6 二进制文件操作,二进制文件操作是通过BinaryReader和BinaryWriter两个类提供的方法来实现的。与文本文件的操作类似,自学。,11.7 序列化和反序列化,序列化用于将对象的状态存储到文件中。在这一过程中,对象的公共字段和私有字段以及类的名称都被转换成字节流,然后写入数据流。在以后反序列化该对象时,创建原始对象的精确副本。,
18、11.7.1 序列化序列化的一个类的最简单方式是使用Serializable属性标记,例如,以下声明了一个可序列的类Student:public class Student private int no; /学号private string name; /姓名public int pno /属性 get return no; set no = value; public string pname /属性get return name; set name = value; ,以下代码说明了该类对象是如何被序列化到一个二进制文件中的:Student s = new Student();s.pno=
19、100; s.pname=“John“;FileStream f = new FileStream(“H:C#2005ch11studnt.dat“,FileMode.Create);BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(f,s);f.Close();,将对象s存储到文件中。,11.7.2 反序列化反序列化将对象还原其以前的状况,首先创建用于读取的文件流和格式接口,然后用格式接口反序列化该对象。以下代码说明了这一过程:f = new FileStream(“H:C#2005ch11studnt.dat“, FileMode.Open);s = (Student)formatter.Deserialize(f);f.Close();其中表示后面是一个路径字符串。需要特别注意的是,在反序列化一个对象时不调用构造函数。,