標籤:style blog http color 使用 檔案
本文要介紹的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