本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件。
第一步:读写文件转成流对象。其实就是读写文件流 (FileStream对象,在System.IO命名空间中)。File、FileInfo、FileStream这三个类可以将打开文件,并变成文件 流。下面是引用微软对File、FileInfo、FileStream的介绍
System.IO.File类 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
System.IO.FileInfo类 提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类。
System.IO.FileStream类 公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。
我直接使用 FileStream,他继承于Stream
第二步:读写流。读写二进制文件用System.IO.BinaryReader和System.IO.BinaryWriter类;读写文本文件用System.IO.TextReader和System.IO.TextWriter类。下面是我的实体 (即要保持到文件的数据)
1 /// <summary> 2 /// 学生基本信息类 3 /// </summary> 4 public class Student 5 { 6 /// <summary> 7 /// 学号变量 8 /// </summary> 9 private String _id; 10 /// <summary> 11 /// 姓名变量 12 /// </summary> 13 private String _name; 14 /// <summary> 15 /// 语文成绩变量 16 /// </summary> 17 private Double _score1; 18 /// <summary> 19 /// 数学成绩变量 20 /// </summary> 21 private Double _score2; 22 /// <summary> 23 /// 英语成绩变量 24 /// </summary> 25 private Double _score3; 26 /// <summary> 27 /// 学号属性 28 /// </summary> 29 public String Id 30 { 31 get { return _id; } 32 set { _id = value; } 33 } 34 /// <summary> 35 /// 姓名属性 36 /// </summary> 37 public String Name 38 { 39 get { return _name; } 40 set { _name = value; } 41 } 42 /// <summary> 43 /// 语文成绩属性 44 /// </summary> 45 public Double Score1 46 { 47 get { return _score1; } 48 set { _score1 = value; } 49 } 50 /// <summary> 51 /// 数学成绩属性 52 /// </summary> 53 public Double Score2 54 { 55 get { return _score2; } 56 set { _score2 = value; } 57 } 58 /// <summary> 59 /// 英语成绩属性 60 /// </summary> 61 public Double Score3 62 { 63 get { return _score3; } 64 set { _score3 = value; } 65 } 66 }
下面是我的读方法,读取文件中的信息到参数List<Student> stu中
1 /// <summary> 2 /// 读取信息方法 3 /// </summary> 4 /// <returns>读取是否成功</returns> 5 public void ReadInfo(List<Student> stu) 6 { 7 Console.WriteLine("请输入文件读取路径:(键入回车为默认路径)"); 8 String filename = Console.ReadLine(); 9 FileStream fs; 10 //默认路径 11 if (filename == "") 12 { 13 fs = new FileStream("student.dll", FileMode.Open); 14 } 15 else 16 { 17 //如果文件不存在,就提示错误 18 if (!File.Exists(filename)) 19 { 20 Console.WriteLine("\n\t读取失败!\n错误原因:可能不存在此文件"); 21 return; 22 } 23 //否则创建文件 24 fs = new FileStream(filename, FileMode.Open); 25 } 26 //使用二进制读取 27 BinaryReader br = new BinaryReader(fs); 28 Console.Write("读取信息将覆盖现有的信息,继续吗?y/n :"); 29 String command = Console.ReadLine(); 30 if (command == "y" || command == "Y") 31 { 32 for (int i = 0; i < stu.Count; i++) 33 { 34 stu.RemoveAt(i); 35 } 36 //从磁盘上读取信息 37 try 38 { 39 while (true) 40 { 41 Student student = new Student(); 42 student.Id = br.ReadString(); 43 student.Name = br.ReadString(); 44 student.Score1 = br.ReadDouble(); 45 student.Score2 = br.ReadDouble(); 46 student.Score3 = br.ReadDouble(); 47 stu.Add(student); 48 student = null; 49 } 50 } 51 catch (Exception) 52 { 53 Console.WriteLine("\n\n读取结束!"); 54 } 55 } 56 br.Close(); 57 fs.Close(); 58 }
下面是我的写入方法,写入参数List<Student> stu中的数据
1 /// <summary> 2 /// 写入信息方法 3 /// </summary> 4 /// <returns>写入是否成功</returns> 5 public void WriteInfo(List<Student> stu) 6 { 7 Console.WriteLine("请输入文件保存路径:(键入回车为默认路径)"); 8 FileStream fs; 9 String filename = Console.ReadLine(); 10 //默认路径 11 if (filename == "") 12 { 13 fs = new FileStream("student.dll", FileMode.Create); 14 } 15 //手动输入路径 16 else 17 { 18 //如果文件存在,就提示错误 19 if (File.Exists(filename)) 20 { 21 Console.WriteLine("\n\t保存失败!\n错误原因:可能存在相同文件"); 22 return; 23 } 24 //否则创建文件 25 fs = new FileStream(filename, FileMode.Create); 26 } 27 //数据保存到磁盘中 28 BinaryWriter bw = new BinaryWriter(fs); 29 foreach (Student student in stu) 30 { 31 bw.Write((String)student.Id); 32 bw.Write((String)student.Name); 33 bw.Write((Double)student.Score1); 34 bw.Write((Double)student.Score2); 35 bw.Write((Double)student.Score3); 36 bw.Flush(); 37 } 38 bw.Close(); 39 fs.Close(); 40 Console.WriteLine("保存成功!"); 41 }
时间: 2024-08-15 06:02:08