網頁

2010年3月14日 星期日

C#二進位檔讀取 存檔 文字檔讀取 存檔

對於檔案的處理,很多人都很害怕,特別是二進位存取,
聽到二進位的存取就莫名的害怕,
不過於C#這些東西都變的非常的簡單,因為C#的函數都幫使用者作好了
不需要瞭解太多,只需要會用就可以,至於怎麼撰寫不再多說因為書上很多
今天要說的是整理成一些方便的函數

成功失敗 = 讀取二進位檔( 路徑檔名 , ref 讀取的結果 )
成功失敗 = 寫入二進位檔( 路徑檔名 , 寫入的陣列 )
成功失敗 = 讀取文字檔( 路徑檔名 , ref 讀取的文字 )
成功失敗 = 寫入文字檔( 路徑檔名 , 寫入的文字 )

這裡大概有些人會驚訝,如果檔案很大,那陣列或是字串會不會死掉,
在C#裡的陣列大小可以定到 2G,也就是檔案如果小於2G都可以讀取近來
ㄧ個String的變數其實可以放到記憶體爆掉,不過當然我們不會做這麼危險的事情
但是把ㄧ整本書的文字都放在一個string的變數裡是輕而ㄧ舉的喔

所以就大膽的用下去,




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace AkingTool
{
class FileIOTool
{
public static int BinWrite(string SaveFileName, byte[] InData)
{
try
{
//開啟建立檔案
FileStream myFile = File.Open(SaveFileName, FileMode.Open , FileAccess.ReadWrite);
BinaryWriter myWriter = new BinaryWriter(myFile);
myWriter.Write(InData);
myWriter.Close();
myFile.Close();
return 1;
}catch (InvalidCastException e)
{
return -1;
}

}

public static int BinRead(string OpenFileName, ref byte[] InData)
{

try
{
//開啟檔案
FileStream myFile = File.Open(OpenFileName, FileMode.Open , FileAccess.ReadWrite);
//引用myReader類別
BinaryReader myReader = new BinaryReader(myFile);
int dl = System.Convert.ToInt32 (myFile.Length);
//讀取位元陣列
InData = myReader.ReadBytes(dl);
//讀取資料
//釋放資源
myReader.Close();
myFile.Close();
return 1;
}
catch (InvalidCastException e)
{
return -1;
}
}

public static int StringWrite(string SaveFileName, string InData)
{
try
{
//建立檔案
FileStream myFile = File.Open(SaveFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamWriter myWriter = new StreamWriter(myFile);
//建立位元陣列
myWriter.Write(InData);
//釋放資源
myWriter.Close();
myFile.Close();
return 1;
}
catch (InvalidCastException e)
{
return -1;
}
}

public static int StringRead(string OpenFileName, ref string InData)
{
try
{
//開啟檔案
FileStream myFile = File.Open(OpenFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
//引用myReader類別
StreamReader myReader = new StreamReader(myFile);
int dl = System.Convert.ToInt32(myFile.Length);
//讀取位元陣列
InData = myReader.ReadToEnd();
//讀取資料
//釋放資源
myReader.Close();
myFile.Close();
return 1;
}
catch (InvalidCastException e)
{
return -1;
}
}
}
}
寫個範例讀寫一下



private void button1_Click(object sender, EventArgs e)
{
string G;
G = "abcdefghijklmnopqrstuvwxyz\nabcdefghijklmnopqrstuvwxyz";
AkingTool.FileIOTool.StringWrite(@"c:\kkk", G);
}

private void button2_Click(object sender, EventArgs e)
{

string K = "";
AkingTool.FileIOTool.StringRead(@"c:\kkk",ref K);
MessageBox.Show(K);
}

private void button3_Click(object sender, EventArgs e)
{
byte[] S = new byte[1024 * 1024]; //寫出1M的檔案
S[10000] = 200;
AkingTool.FileIOTool.BinWrite(@"C:\Bin.bin", S);
}

private void button4_Click(object sender, EventArgs e)
{
byte[] ReadS = new byte[0]; //'讀取1M 的檔案,大小先設定為0 後來自動調整為 1M
AkingTool.FileIOTool.BinRead (@"C:\Bin.bin",ref ReadS);
MessageBox.Show ( ReadS[10000].ToString() );
}

沒有留言: