本文要介绍的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类。下面是我的实体 (即要保持到文件的数据)
第一步:读写文件转成流对象。其实就是读写文件流 (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 ; }
}
}
/// 学生基本信息类
/// </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( "保存成功!" );
}
/// 读取信息方法
/// </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( "保存成功!" );
}