第7章 目录和文件操作 王德俊 上海交通大学继续教育学院
第7章 目录和文件操作 7.1 目录管理 7.2 文件管理 7.3 文本文件的读写 7.4 二进制文件的读写 基于文件整体操作的I/O类 第7章 目录和文件操作 7.1 目录管理 7.2 文件管理 7.3 文本文件的读写 7.4 二进制文件的读写 基于文件整体操作的I/O类 基于文件信息的I/O流类
7.3 文本文件的读写 使用StreamReader类和StreamWriter类实现对文本文件的读 写操作 7.3.1 读文本文件 7.3.2 写文本文件
7.3.1 读文本文件 使用StreamReader类实现文本文件的读取 例如: StreamReader srFile = new StreamReader(“C:\\MyFile.txt");
7.3.1 读文本文件 StreamReader类定义了10个版本的重载构造函数,其中常用两 种: public StreamReader(string path) public StreamReader(string path, System.Text.Encoding encoding) 其中,参数path为文件路径,encoding用于设置编码方式,如果文件 中包含中文,该参数一般设置为System.Text.Encoding.Default。
7.3.1 读文本文件 StreamReader类常用方法有: BaseStream.Seek()方法:指定在输入流中读取字符的位置 ReadLine方法:从文件中读入下一行字符 Close方法:关闭打开的文件 ReadToEnd方法:从文件的当前位置读到文件的末尾
BaseStream.Seek()方法 用于指定在输入流中读取字符的位置,原型如下: 其中, 例: long BaseStream.Seek(long offset, SeekOrigin origin) 其中, origin:用于设置在输入流中读取字符的初始位置,其可能取值包括SeekOrigin.Begin、SeekOrigin.Current和SeekOrigin.End,分别表示初始位置为输入流的开始处、当前位置和流的末尾; offset:相对于origin参数的字节偏移量,初始位置+offset就是在输入流中读取字符的真正位置。 例: StreamReader reader = new StreamReader(@"D:\test.txt"); reader.BaseStream.Seek(10, SeekOrigin.Begin);
Read()方法 该方法用于读取输入流中的下一个字符,同时使输入流的当 前位置加1。该函数返回字符的ASCII码的int型整数。 例如: string path = @"D:\test.txt"; StreamReader reader; reader = new StreamReader(path, System.Text.Encoding.Default); int ascii = reader.Read(); //获得字符的unicode的int32编码 char ch = (char)ascii; //转换为字符 while (ascii != -1) { richTextBox1.Text += ch.ToString(); ascii = reader.Read(); ch = (char)ascii; } reader.Close();
ReadLine()方法 该方法用于从输入流中读取一行字符,并将结果以字符串返回。 例如,下面代码从文本文件“毛主席诗词2.txt”中的第10字符开始,逐行读取文本,并将结果显示在richTextBox1控件中 string path = @"D:\VS2008\第7章\Files\毛主席诗词2.txt"; StreamReader reader = new StreamReader(path, System.Text.Encoding.Default); reader.BaseStream.Seek(10, SeekOrigin.Begin); string line = reader.ReadLine(); while (line != null) { richTextBox1.Text += line + "\n"; line = reader.ReadLine(); } reader.Close();
补充示例:StreamFileAccess 用“打开文件对话框”选择文件,打开并显示全部内容
private void Button1_Click(System. Object sender, System private void Button1_Click(System.Object sender, System.EventArgs e) { OpenFileDialog1.InitialDirectory = "C:\\"; OpenFileDialog1.Filter = "text files (*.txt)|*.txt|All Files (*.*)|*.*"; if (OpenFileDialog1.ShowDialog() == DialogResult.OK) StreamReader sr = new StreamReader(OpenFileDialog1.FileName); MessageBox.Show(sr.ReadToEnd()); // 从文件的当前位置读到文件的末尾 sr.Close(); }
7.3.2 写文本文件 使用StreamWriter类实现文本文件的写入 例如: StreamWriter swFile = new StreamWriter (“C:\\MyFile.txt");
7.3.2 写文本文件 StreamWriter类常用方法有: Write方法:向文件中写入一个字符串 WriteLine方法:向文件中写入一个字符串和一个换行符(写入一行) Close方法:释放StreamWriter对象,并关闭打开的文件
Write方法 该方法用于向输出流写入字符串、字符、字符数组、实数和整 数等。它一共有17个重载版本,常用: public override void Write(string value) public override void Write(char value) public override void Write(char[ ] buffer) public override void Write(double value) public override void Write(float value) public override void Write(decimal value) public override void Write(int value) public override void Write(long value)
Write方法(续) 例如: 注意:Write()方法执行完后,不会自动添加回车换行符。如果 需要,必须显式添加。 string path = @"D:\test3.txt"; StreamWriter writer = new StreamWriter(path, false, System.Text.Encoding.Default); writer.Write("aaaaaaa"); writer.Write("BBBBB"); //这两个语句相当于回车换行的作用 writer.Write('\r'); writer.Write('\n'); writer.Write("ccccc"); writer.Close(); 注意:Write()方法执行完后,不会自动添加回车换行符。如果 需要,必须显式添加。
WriteLine方法 与Write()方法基本相同,用于将字符串、字符、字符数组、实 数和整数等写入输出流中。 主要不同之处在于,WriteLine()方法执行后会自动添加一个回 车换行符“\r\n”,而Write()方法没有。
补充示例:TxtRW 在一个文本框TxtFileName中输入文件路径 然后将文本框TxtFile中的内容写入指定的文件
private void BtnWrite_Click(System.Object sender, System.EventArgs e) { StreamWriter swFile = new StreamWriter(TxtFileName.Text); swFile.Write(TxtFile.Text); swFile.Close(); } private void BtnRead_Click(System.Object sender, System.EventArgs e) StreamReader srFile = new StreamReader(TxtFileName.Text); TxtFile.Clear(); TxtFile.Text = srFile.ReadToEnd(); srFile.Close(); 在写入和读出操作完成之后,一定要调用Close方法关闭文件,只有这样才能确保写入和读出文件的正确完成
7.4 二进制文件的读写 二进制文件使用 BinaryReader 和BinaryWriter 类实现读写操作 这两个类一般都要与FileStream类结合使用,即由FileStream类创建文件 流,然后利用BinaryReader类和BinaryWriter类实现对文件流的读写操作, 从而实现对文件的读写操作。 通过BinaryReader类,可以把原始数据类型的数据读取为具有特定编 码格式的二进制数据 通过BinaryWriter类,可以把原始数据类型的数据写入流中,并且还可 以写入具有特定编码格式的字符串
FileStream类 FileStream类提供一共4个重载构造函数,常用的两种: 其中, public FileStream(string path, FileMode mode) public FileStream(string path, FileMode mode, FileAccess access) 其中, path:用于设置文件路径; access:用于对文件的访问方式,可能取值包括FileMode.Read、 FileMode.Write、FileMode.ReadWrite,分别表示只读、只写、可读写; mode:其可能取值及其意义见下页:
FileMode类的常用属性及其意义 FileMode.Append:表示以追加方式打开文件(打开后文件位置移动到文件的 末尾),FileMode.Append仅可以与FileAccess.Write联合使用。 FileMode.Create:创建新的文件,如果已存在同名的文件,则覆盖它。 FileMode.CreateNew:创建新的文件,但如果已经存在同名的文件,则抛出异 常。 FileMode.Open:打开已有的文件,但如果不存在所指定的文件,则抛出异常。 FileMode.OpenOrCreate:如果文件已存在,则打开它,否则创建新的文件。 FileMode.Truncate:打开已有的文件,当写入数据时将覆盖文件中原有的数 据,但文件的基本属性保持不变(如初始创建日期等)。如果指定的文件不存 在则抛出异常。
BinaryWriter类的两个构造函数: 7.4 二进制文件的读写 7.4.1 写二进制文件 BinaryWriter类的两个构造函数: public BinaryWriter(Stream output,) public BinaryWriter(Stream output, Encoding encoding) 其中,参数output用于设置流对象,通常是由FileStream类实例化的 对象。
BinaryWriter类常用方法: 7.4 二进制文件的读写 7.4.1 写二进制文件 BaseStream.Seek()方法:用于设置输出流中当前的位置。 Write()方法:一共重载18个版本,其中大部分与StreamWriter类的 Write()方法相同。常用的方法: public override void Write(byte[ ] buffer)将字节数组buffer中所有字 节全部保存到二进制文件 public override void Write(byte[ ] buffer, int index, int count)将数组 buffer中从索引为index开始、一共count个字节保存到二进制文件中
通过BinaryWriter类写文件的关键代码: 7.4 二进制文件的读写 7.4.1 写二进制文件 通过BinaryWriter类写文件的关键代码: string path = @"C:\test.dat"; FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); BinaryWriter writer = new BinaryWriter(fs); writer.BaseStream.Seek(0, SeekOrigin.Begin); //设置当前位置 writer.Write("中华人民共和国"); //写入数据 writer.Close(); fs.Close();
类BinaryReader提供许多用于读取输入流中的数据,主要包括: 7.4 二进制文件的读写 7.4.2 读二进制文件 类BinaryReader提供许多用于读取输入流中的数据,主要包括: public abstract int Read(byte[ ] buffer, int index, int count) public abstract byte ReadByte() public abstract byte[ ] ReadBytes() public abstract char ReadChar() public abstract char[ ] ReadChars() public abstract decimal ReadDecimal() public abstract double ReadDouble() public abstract short ReadInt16() public abstract int ReadInt32() public abstract long ReadInt64() public abstract float ReadSingle() public abstract string ReadString()
读二进制文件的关键代码: string path = @"C:\test.dat"; FileStream fs = new FileStream(path, FileMode.Open); BinaryReader reader = new BinaryReader(fs); reader.BaseStream.Seek(0, SeekOrigin.Begin); //设置当前位置 //可通过判断fs.Position是否等于fs.Length来断定是否已经读完 string s = reader.ReadString(); reader.Close(); fs.Close();
注意:读写二进制文件时,读文件语句的写法和顺序完全由写文件的格式来决定,相应的语句要一一对应,不能有差错,否则将读出乱码。 例如,下列的写文件语句和读文件语句必须一一对应,否则将导致错误读出数据:
为了避免错误对应读出和写入的数据,可以通过读取和写入整个对象, 即:对象序列化。 序列化对象是一个表示为字节序列的对象,它包含对象的数据以及 关于对象类型和对象中所保存数据类型的信息。序列化对象写入文 件后,可以从文件读取它并反序列化,即:用对象类型及对象中所 保存数据类型的信息和字节在内存中重建对象。 BinaryFormatter类可以读入和写入流中的整个对象,其Serialize方法将 对象表示写入文件,Deserialize方法从文件读取这个表示并重建原始对 象。
本讲小结 文本文件的读写 二进制文件的读写