FileStream對象表示在磁碟或網路路徑上指向檔案的流。這個類提供了在檔案中讀寫位元組的方法,但經常使用StreamReader或StreamWriter執行這些功能。這是因為FileStream類操作的是位元組和位元組數組,而Stream類操作的是字元資料。這是這兩種類的一個重要區別,如果你是準備讀取byte資料的話,用StreamReader讀取然後用System.Text.Encoding.Default.GetBytes轉化的話,如下,則可能出現資料丟失的情況,如byte資料的個數不對等。因此操作byte資料時要用FileStream。
string textContent = fileStream.ReadToEnd();byte[] bytes = System.Text.Encoding.Default.GetBytes(textContent);
字元資料便於使用,但是有些操作,比如隨機檔案訪問(訪問檔案中間某點的資料),就必須由FileStream對象執行.
其中建立FileStream對象最簡單的建構函式如下:
1 FileStream file = newFileStream(fileName,FileMode.Member);
2 FileStream file = newFileStream(fileName, FileMode.Member, FileAccess.Member);
而FileAccess的成員:
成員 |
說明 |
Read |
開啟檔案,用於唯讀 |
Write |
開啟檔案,用於唯寫 |
ReadWrite |
開啟檔案,用於讀寫 |
對檔案進行不是FileAccess枚舉成員指定的操作會導致拋出異常。此屬性的作用是,基於使用者的身分識別驗證層級改變使用者對檔案的存取權限。
在FileStream建構函式不使用FileAccess枚舉參數的版本中,使用預設值FileAccess. ReadWrite。
FileMode枚舉成員,使用每個值會發生什麼,取決於指定的檔案名稱是否表示已有的檔案。
成員 |
檔案存在 |
檔案不存在 |
Append |
開啟檔案,流指向檔案的末尾,只能與枚舉FileAccess.Write聯合使用 |
建立一個新檔案。只能與枚舉FileAccess.Write聯合使用 |
Create |
刪除該檔案,然後建立新檔案 |
建立新檔案 |
CreateNew |
拋出異常 |
建立新檔案 |
Open |
開啟現有的檔案,流指向檔案的開頭 |
拋出異常 |
OpenOrCreate |
開啟檔案,流指向檔案的開頭 |
建立新檔案 |
Truncate |
開啟現有檔案,清除其內容。流指向檔案的開頭,保留檔案的初始建立日期 |
拋出異常 |
FileStream類操作的是位元組和位元組數組,而Stream類操作的是字元資料
StreamWriter允許將字元和字串寫入檔案,它處理底層的轉換,向FileStream對象寫入資料。StreamReader也類似。
執行個體:
1 using System;
2 usingSystem.Data;
3 using System.IO;
4 usingSystem.Text;
5
6 /**////<summary>
7 /// Summary description for FileReadAndWrite
8 ///</summary>
9 publicclassFileReadAndWrite
10 {
11 publicFileReadAndWrite()
12 {
13 //
14 // TODO: Add constructor logic here
15 //
16 }
17 /**////<summary>
18 ///用FileStream寫檔案
19 ///</summary>
20 ///<param name="str"></param>
21 ///<returns></returns>
22 publicvoidFileStreamWriteFile(stringstr)
23 {
24 byte[] byData;
25 char[] charData;
26 try
27 {
28 FileStreamnFile = newFileStream("love.txt", FileMode.Create);
29 //獲得字元數組
30 charData = str.ToCharArray();
31 //初始化位元組數組
32 byData = newbyte[charData.Length];
33 //將字元數群組轉換為正確的位元組格式
34 Encoder enc = Encoding.UTF8.GetEncoder();
35 enc.GetBytes(charData, 0, charData.Length,byData,0,true);
36 nFile.Seek(0, SeekOrigin.Begin);
37 nFile.Write(byData, 0, byData.Length);
38 }
39 catch (Exception ex)
40 {
41 throw ex;
42 }
43 }
44 /**////<summary>
45 ///FileStream讀取檔案
46 ///</summary>
47 ///<param name="filePath"></param>
48 ///<returns></returns>
49 publicstringFileStreamReadFile(stringfilePath)
50 {
51 byte[] data = newbyte[100];
52 char[] charData = newchar[100];
53 try
54 {
55 FileStream file = newFileStream(filePath, FileMode.Open);
56 //檔案指標指向0位置
57 file.Seek(0, SeekOrigin.Begin);
58 //讀入兩百個位元組
59 file.Read(data, 0, 200);
60 //提取位元組數組
61 Decoder dec = Encoding.UTF8.GetDecoder();
62 dec.GetChars(data, 0, data.Length, charData, 0);
63 }
64 catch (Exception ex)
65 {
66 throw ex;
67 }
68 returnConvert.ToString(charData);
69 }
70 /**////<summary>
71 ///StreamWriter寫檔案
72 ///</summary>
73 publicvoidStreamWriterWriteFile()
74 {
75 try
76 {
77 FileStreamnFile = newFileStream("love.txt", FileMode.CreateNew);
78 StreamWriter writer = newStreamWriter(nFile);
79
80 writer.WriteLine("I love You!");
81 writer.WriteLine("Do you love me!");
82 writer.Close();
83 }
84 catch
85 { }
86 }
87 /**////<summary>
88 ///StreamReader讀取檔案
89 ///</summary>
90 ///<returns></returns>
91 publicstringStreamReaderReadFile()
92 {
93 stringstr="";
94 try
95 {
96 FileStream file = newFileStream("love.txt", FileMode.Open);
97 StreamReadersr = newStreamReader(file);
98 while (sr.ReadLine()!=null)
99 {
100 str += sr.ReadLine();
101 }
102 //或者str = sr.ReadToEnd();
103 sr.Close();
104 }
105 catch
106 { }
107 returnstr;
108 }
109 }
110