標籤:
FileStream對象表示在磁碟或網路路徑上指向檔案的流。當類提供向檔案讀寫位元組的方法時,經常使用StreamReader或StreamWriter執行這些功能。這是因為FileStream類操作位元組和位元組數組,而Stream類操作字元資料。字元資料便於使用,但是有些操作比如隨機檔案訪問,就必須由FileStream對象執行。
FileStream對象的建構函式:
FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);
FileMode枚舉具有幾種成員:
Append------如果檔案存在,就開啟檔案,將檔案位置移動到檔案的末尾,並建立一個新檔案。FileMode.Append僅可以與枚舉Fileaccess.Write聯合使用
Create------建立新檔案;如果存在這樣的檔案,就破壞它。
CreateNew------建立新檔案,但是如果已經存在此檔案,則拋出異常
Open------開啟現有的檔案,但是不存在所指定的檔案,則拋出異常
OpenOrCreate------如果檔案存在,則規定開啟檔案,否則就建立新檔案,如果檔案已經存在,則保留在檔案中的資料
Truncate------開啟現有檔案,清除其內容,然後我們可以向檔案寫入全新的資料,但是保留檔案的初始建立日期,必須存在有檔案,否則就拋出異常
存取層級
前面的建構函式預設以唯讀模式開啟檔案,需要一個附加參數規定不同的存取層級,此參數是FileAccess參數。
FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)
FileAccess枚舉有三種類型:Read、Write、ReadWrite.此屬性的作用是:基於使用者的身分識別驗證層級改變使用者對檔案的訪問
讀取檔案的位置用seek:public long Seek(long offset,SeekOrigin origin)
Long offset是規定檔案指標以位元組為單位的移動距離;SeekOrigin origin是規定開始計算的起始位置,此枚舉包含3個值:Begin,Current和End。
例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是檔案指標從檔案的第一個位元組起;而參數‘8‘指得是移動到檔案的第8個位元組
例2:afile.Seek(2,SeekOrigin.Current)//在當前位置開始,再移動2個位元組。
例3:aFile.Seek(-5,SeekOrigin.End)//在檔案末端位置開始,倒數5個位元組。
讀取資料
使用FileStream類讀取資料不像使用StreamReader和StreamWriter類讀取資料那麼容易,這是因為FileStream類只能處理原始位元組(raw byey),這使得FileStream類可以用於任何資料檔案,而不僅僅是文字檔,通過讀取位元組資料就可以讀取類似映像和聲音的檔案。這種靈活性的代價是不能使用它直接讀入字串,而使用StreamWriter和StreaMeader類卻可以這樣處理,從是有幾種轉換類可以很容易地將位元組數群組轉換為字元數組,或者進行相反的操作。
Read()方法是從FileStream對象所指向的檔案訪問資料的主要手段:
Public int Read(byte[] array,int offset, int count)//第一個參數是被傳輸進來的位元組數組,用以接受FileStream對象中的資料。第二個參數是位元組數組中開始寫入資料的位置,它通常是0,表示從數組的開端的檔案中向數組寫資料,最後一個參數是規定從檔案中讀出多少位元組。
寫入資料
寫入資料的流程是先擷取位元組數組,再把位元組資料轉換為字元數組,然後把這個字元數組用Write()方法寫入到檔案中,當然在寫入的過程中,可以確定在檔案的什麼位置寫入,寫多少字元等等。
檔案讀寫的範例:
讀取檔案
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace myFile
{
class PRogram
{
static void Main(string[] args)
{
byte[] byData = new byte[100];//建立一個FileStream要用的位元組組
char[] charData = new char[100];//建立一個字元組
try
{
FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//執行個體化一個FileStream對象,用來操作data.txt檔案,操作類型是
aFile.Seek(55, SeekOrigin.Begin);//把檔案指標指向,從檔案開始位置向前55位位元組所指的位元組
aFile.Read(byData, 0, 100);//讀取FileStream對象所指的檔案到位元組數組裡
}
catch (IOException e)
{
Console.WriteLine("close");
return;
}
Decoder d = Encoding.UTF8.GetDecoder();//
d.GetChars(byData, 0, byData.Length, charData, 0);//將編碼位元組數群組轉換為字元數組
Console.WriteLine(charData);
Console.ReadLine();
return;
}
}
}
寫入檔案:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace myFile
{
class Program
{
static void Main(string[] args)
{
byte[] byData = new byte[100];//建立一個FileStream要用的位元組組
char[] charData = new char[100];//建立一個字元組
try
{
FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//執行個體化一個FileStream對象,用來操作data.txt檔案,操作類型是
charData = "我是誰?111?".ToCharArray();//將字串內的字元複製到字元組裡
aFile.Seek(0, SeekOrigin.End);
Encoder el = Encoding.UTF8.GetEncoder();//編碼器
el.GetBytes(charData, 0, charData.Length, byData, 0, true);
aFile.Write(byData, 0, byData.Length);
}
catch (IOException e)
{
Console.WriteLine("close");
return;
}
}
}
}
C# FileStream對象