close

讀:電腦利用「指標」來從檔案讀取資料,指標的意義等同於「讀取位置」。比如,今有個文字檔案,內容是:abcde,一開始指標在檔案開頭的位置(a處,用數字0代表該指標所在位置),每讀取一個字元,指標就往後進一個字元(例如連續讀取了abc3個字元後,指標就在d處,用數字3代表該指標所在位置)。使用者可以利用程式碼來操控指標,以方便讀取自己所想要讀取的檔案內容。

寫:一個完整的「將字串寫入檔案」的過程,須依序包含四個步驟:建立串流物件à利用串流物件將字串寫入緩衝區(buffer)à將緩衝區的字串寫入檔案à關閉串流物件。串流物件有FileStream物件、StreamReader物件、StreamWriter物件。FileStream物件可用來讀和寫,StreamReader物件可用來讀取,StreamWriter物件可用來寫入。一一介紹如下。

(1) 將檔案資料看做位元組(byte)的形式,來讀寫它:

須利用到FileStream物件。FileStream物件的宣告方式:

FileStream 物件名稱 = new FileStream(String "路徑", FileMode FileMode物件 [ ,FileAccess FileAccess物件])

(1-1) FileStream物件常用的成員:

物件名稱.CanRead:一個bool。若為true表示該FileStream物件可對路徑上的檔案進行讀取,若為false則否。可否對檔案進行讀取,和該FileStream物件的FileMode物件之設定有關。

物件名稱.CanWrite:一個bool。若為true表示該FileStream物件可對路徑上的檔案進行寫入,若為false則否。可否對檔案進行寫入,和該FileStream物件的FileMode物件之設定有關。

物件名稱.Length:一個long(長整數)。代表路徑上檔案的byte數目。

物件名稱.Position:一個long(長整數)。代表該FileStream物件在路徑上檔案中,其指標的位置。

(1-2) FileStream物件常用的成員函式:

物件名稱.Seek(long N, SeekOrigin 參考點):回傳一個long。此函式可以將指標的位置設定為相對於參考點而言、往後進Nbyte的位置,並將設定完成後的位置回傳。參考點是一個SeekOrigin物件,SeekOrigin物件可用以下方法呼叫:

SeekOrigin.Begin:表示將參考點設在檔案的開頭。

SeekOrigin.Current:表示將參考點設在當前的指標位置。

SeekOrigin.End:表示將參考點設在檔案的末尾。

物件名稱.ReadByte():回傳一個int。此函式可以從當前的指標位置讀取一個byte,並將這個byte轉為整數、以int型態儲存而回傳。使用前提是該FileStream物件的FileAccess物件要允許讀取才行。而因英文、數字、標點符號均是一個byte,而中文卻是兩個byte,故此函式無法順利讀取中文。而讀取出來的int須轉化為字元才能顯現成文字,做法如:

cahr this_char = (char)物件名稱.ReadByte();

物件名稱.WriteByte(byte N):無回傳值。此函式可以從當前的指標位置,將一個byte型別的變數N(byte型別的變數,其允許值為0~255)轉化為字元,而直接寫入檔案。使用前提是該FileStream物件的FileAccess物件要允許寫入才行。

物件名稱.Close():無回傳值。此函式可以關閉該FileStream物件。FileStream物件使用完後建議關閉,以免占用系統資源。

(2) 將檔案資料看做文字(char(字元)string(字串))的形式,來讀取它:

須利用到一個StreamReader物件。StreamReader物件常用的宣告方式為:

StreamReader 變數名稱= new StreamReader (String "路徑" [ ,Encoding 編碼]);

可將讀取路徑上檔案的資料。

StreamReader 變數名稱= new StreamReader (FileStream FileStream物件[ ,Encoding 編碼]);

可將讀取FileStream物件之檔案的資料。

編碼,即是說以何種編碼讀取檔案內容文字,是個Encoding物件。Encoding物件的呼叫方法如下:

Encoding.ASCII:表示利用ASCII編碼來讀取檔案內容文字,ASCII編碼以一個byte作為一個字元。

Encoding.Unicode:表示利用Unicode編碼來讀取檔案內容文字。

Encoding.UTF8:表示利用UTF8編碼來讀取檔案內容文字,UTF8編碼一至四個byte作為一個字元(字元的byte數目乃是可變的)。這是預設值。

Encoding.GetEncoding("Big5")表示利用Big5編碼來讀取檔案內容文字。Big5用於為某些老舊的繁體中文檔案編碼。

(2-2) StreamReader物件常用的成員:

物件名稱.EndOfStream:一個bool。若為true,表示指標已在檔案的最末尾。若為false則否。此成員通常搭配while迴圈,來控制檔案的讀取內容。

(2-2) StreamReader物件常用的成員函式:

物件名稱.Read():回傳一個int(代表該字元之編碼的數值),並將指標往後進一個字元。若已讀至檔案末尾而無字元可讀,則回傳-1。可將該編碼數值轉換成字元,如:

char t = (char)物件名稱.Read();

則這個 t 就會是該字元。

物件名稱.Peek():回傳一個int(代表該字元之編碼的數值),不過並不移動指標。若已讀至檔案末尾而無字元可讀,則回傳-1。可將該編碼數值轉換成字元,和將物件名稱.Read()轉換為字元的方法相同。

物件名稱.ReadLine():回傳一個String。此函式在檔案內容中,以當前指標所在位置為出發點開始讀取,直到碰上第一個斷行字元為止。並將所讀取的內容文字回傳。

物件名稱.ReadToEnd():回傳一個String。此函式在檔案內容中,以當前指標所在位置為出發點開始讀取,直到檔案的末尾為止。並將所讀取的內容文字回傳。

物件名稱.Close():無回傳值。此函式會關閉該StreamReader物件。StreamReader物件在使用完後建議關閉,以免占用系統資源。

(3) 將檔案資料看做文字(char(字元)string(字串))的形式,來寫入它:

須利用到一個StreamWriter物件。StreamWriter物件最常用的宣告方式為:

StreamWriter 變數名稱= new StreamWriter(string "路徑" [,bool 添寫參數]);

可將資料寫入路徑上的檔案。其中,添寫參數若為true,表示寫入的方法是「添寫(保留原有資料,並從檔案末尾將新資料添寫進去)」而非「覆寫」,若為false則為覆寫。預設值為false

StreamWriter 變數名稱= new StreamWriter(FileStream FileStream物件);

可將資料寫入FileStream物件上的檔案。

(3-1) StreamWriter物件的常用成員函式有:

物件名稱.Write( 變數 ):無回傳值。其中,變數可以是字串、數字型態的變數、bool型態的變數、甚至可以是物件。此函式可將非字串型態的變數轉換成字串,並且寫入緩衝區。

物件名稱.WriteLine( 變數 ):無回傳值。此函式相當於在執行物件名稱.Write( 變數 )之後,再將斷行字元寫入緩衝區。

物件名稱.Flush():無回傳值。此函式可將緩衝區的資料寫入檔案。

物件名稱.Close():無回傳值。此函式可將緩衝區的資料寫入檔案,然後關閉檔案。StreamWriter物件在使用完後建議關閉,以免占用系統資源。

 

※ 簡單範例(檔案開頭已有加入using System.IO;這一行)

private void Form1_Load(object sender, EventArgs e)

{

      DirectoryInfo main_dir = new DirectoryInfo("main_dir");

      if (!main_dir.Exists)

      {

            main_dir.Create();

            FileInfo this_file = new FileInfo("main_dir\\file1.txt");

            FileStream this_file_stream = this_file.Create();

            StreamWriter this_file_writer = new StreamWriter(this_file_stream);

            this_file_writer.WriteLine("現在時間是:" + DateTime.Now);

            this_file_writer.Close();

      }

      else

      { textBox1.Text = "已存在main_dir資料夾!"; }

}

程式執行後,在該專案的專案名稱\bin\Debug」路徑下就會出現一個main_dir資料夾,其中有個file1.txt文字檔,其中就寫著程式執行時的時間。

 

 

上一篇:檔案的處理

下一篇:影像(image)

按此前往C#完整教學目錄

arrow
arrow

    埃伯 發表在 痞客邦 留言(0) 人氣()