您的位置:首页 > 编程语言 > C#

C#读写二进制文件

2013-11-18 15:58 381 查看
本文要介绍的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类。下面是我的实体
(即要保持到文件的数据)

/// <summary>

/// 学生基本信息类

/// </summary>

public class Student

{

/// <summary>

/// 学号变量

/// </summary>

private String _id;

/// <summary>

/// 姓名变量

/// </summary>

private String _name;

/// <summary>

/// 语文成绩变量

/// </summary>

private Double _score1;

/// <summary>

/// 数学成绩变量

/// </summary>

private Double _score2;

/// <summary>

/// 英语成绩变量

/// </summary>

private Double _score3;

/// <summary>

/// 学号属性

/// </summary>

public String Id

{

get { return _id; }

set { _id = value; }

}

/// <summary>

/// 姓名属性

/// </summary>

public String Name

{

get { return _name; }

set { _name = value; }

}

/// <summary>

/// 语文成绩属性

/// </summary>

public Double Score1

{

get { return _score1; }

set { _score1 = value; }

}

/// <summary>

/// 数学成绩属性

/// </summary>

public Double Score2

{

get { return _score2; }

set { _score2 = value; }

}

/// <summary>

/// 英语成绩属性

/// </summary>

public Double Score3

{

get { return _score3; }

set { _score3 = value; }

}

}
下面是我的读方法,读取文件中的信息到参数List<Student> stu中
/// <summary>

/// 读取信息方法

/// </summary>

/// <returns>读取是否成功</returns>

public void ReadInfo(List<Student> stu)

{

Console.WriteLine("请输入文件读取路径:(键入回车为默认路径)");

String filename = Console.ReadLine();

FileStream fs;

//默认路径

if (filename == "")

{

fs = new FileStream("student.dll", FileMode.Open);

}

else

{

//如果文件不存在,就提示错误

if (!File.Exists(filename))

{

Console.WriteLine("\n\t读取失败!\n错误原因:可能不存在此文件");

return;

}

//否则创建文件

fs = new FileStream(filename, FileMode.Open);

}

//使用二进制读取

BinaryReader br = new BinaryReader(fs);

Console.Write("读取信息将覆盖现有的信息,继续吗?y/n :");

String command = Console.ReadLine();

if (command == "y" || command == "Y")

{

for (int i = 0; i < stu.Count; i++)

{

stu.RemoveAt(i);

}

//从磁盘上读取信息

try

{

while (true)

{

Student student = new Student();

student.Id = br.ReadString();

student.Name = br.ReadString();

student.Score1 = br.ReadDouble();

student.Score2 = br.ReadDouble();

student.Score3 = br.ReadDouble();

stu.Add(student);

student = null;

}

}

catch (Exception)

{

Console.WriteLine("\n\n读取结束!");

}

}

br.Close();

fs.Close();

}

下面是我的写入方法,写入参数List<Student> stu中的数据

/// <summary>

/// 写入信息方法

/// </summary>

/// <returns>写入是否成功</returns>

public void WriteInfo(List<Student> stu)

{

Console.WriteLine("请输入文件保存路径:(键入回车为默认路径)");

FileStream fs;

String filename = Console.ReadLine();

//默认路径

if (filename == "")

{

fs = new FileStream("student.dll", FileMode.Create);

}

//手动输入路径

else

{

//如果文件存在,就提示错误

if (File.Exists(filename))

{

Console.WriteLine("\n\t保存失败!\n错误原因:可能存在相同文件");

return;

}

//否则创建文件

fs = new FileStream(filename, FileMode.Create);

}

//数据保存到磁盘中

BinaryWriter bw = new BinaryWriter(fs);

foreach (Student student in stu)

{

bw.Write((String)student.Id);

bw.Write((String)student.Name);

bw.Write((Double)student.Score1);

bw.Write((Double)student.Score2);

bw.Write((Double)student.Score3);

bw.Flush();

}

bw.Close();

fs.Close();

Console.WriteLine("保存成功!");

}

原文地址:http://www.cnblogs.com/top5/archive/2011/02/07/1949675.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: