FileStream對象表示在磁盤或網(wǎng)絡(luò)路徑上指向文件的流。這個類提供了在文件中讀寫字節(jié)的方法,但經(jīng)常使用StreamReader或StreamWriter執(zhí)行這些功能。這是因為FileStream類操作的是字節(jié)和字節(jié)數(shù)組,而Stream類操作的是字符數(shù)據(jù)。字符數(shù)據(jù)易于使用,但是有些操作,比如隨機文件訪問(訪問文件中間某點的數(shù)據(jù)),就必須由FileStream對象執(zhí)行,稍后對此進行介紹。
還有幾種方法可以創(chuàng)建FileStream對象。構(gòu)造函數(shù)具有許多不同的重載版本,最簡單的構(gòu)造函數(shù)僅僅帶有兩個參數(shù),即文件名和FileMode枚舉值。
FileMode枚舉有幾個成員,規(guī)定了如何打開或創(chuàng)建文件。稍后介紹這些枚舉成員。另一個常用的構(gòu)造函數(shù)如下:
第三個參數(shù)是FileAccess枚舉的一個成員,它指定了流的作用。FileAccess枚舉的成員如表22-6所示。
表 22-6
| 成員 | 說明 |
|---|---|
| Read | 打開文件,用于只讀 |
| Write | 打開文件,用于只寫 |
| ReadWrite | 打開文件,用于讀寫 |
對文件進行不是FileAccess枚舉成員指定的操作會導(dǎo)致拋出異常。此屬性的作用是,基于用戶的身份驗證級別改變用戶對文件的訪問權(quán)限。
在FileStream構(gòu)造函數(shù)不使用FileAccess枚舉參數(shù)的版本中,使用默認(rèn)值FileAccess. ReadWrite。
FileMode枚舉成員如表22-7所示。使用每個值會發(fā)生什么,取決于指定的文件名是否表示已有的文件。注意這個表中的項表示創(chuàng)建流時該流指向文件中的位置,下一節(jié)將詳細(xì)討論這個主題。除非特別說明,否則流就指向文件的開頭。
表 22-7
| 成員 | 文件存在 | 文件不存在 |
|---|---|---|
| Append | 打開文件,流指向文件的末尾,只能與枚舉FileAccess.Write聯(lián)合使用 | 創(chuàng)建一個新文件。只能與枚舉FileAccess.Write聯(lián)合使用 |
| Create | 刪除該文件,然后創(chuàng)建新文件 | 創(chuàng)建新文件 |
| CreateNew | 拋出異常 | 創(chuàng)建新文件 |
| Open | 打開現(xiàn)有的文件,流指向文件的開頭 | 拋出異常 |
| OpenOrCreate | 打開文件,流指向文件的開頭 | 創(chuàng)建新文件 |
| Truncate | 打開現(xiàn)有文件,清除其內(nèi)容。流指向文件的開頭,保留文件的初始創(chuàng)建日期 | 拋出異常 |
File和FileInfo類都提供了OpenRead()和OpenWrite()方法,更易于創(chuàng)建FileStream對象。前者打開了只讀訪問的文件,后者只允許寫入文件。這些都提供了快捷方式,因此不必以FileStream構(gòu)造函數(shù)的參數(shù)形式提供前面所有的信息。例如,下面的代碼行打開了用于只讀訪問的Data.txt文件:
注意下面的代碼執(zhí)行同樣的功能:
1. 文件位置
FileStream類維護內(nèi)部文件指針,該指針指向文件中進行下一次讀寫操作的位置。在大多數(shù)情況下,當(dāng)打開文件時,它就指向文件的開始位置,但是此指針可以修改。這允許應(yīng)用程序在文件的任何位置讀寫,隨機訪問文件,或直接跳到文件的特定位置上。當(dāng)處理大型文件時,這非常省時,因為馬上可以定位到正確的位置。
實現(xiàn)此功能的方法是Seek()方法,它有兩個參數(shù):第一個參數(shù)規(guī)定文件指針以字節(jié)為單位的移動距離。第二個參數(shù)規(guī)定開始計算的起始位置,用SeekOrigin枚舉的一個值表示。Seek Origin枚舉包含3個值:Begin、Current和End。
例如,下面的代碼行將文件指針移動到文件的第8個字節(jié),其起始位置就是文件的第1個字節(jié):
下面的代碼行將指針從當(dāng)前位置開始向前移動2個字節(jié)。如果在上面的代碼行之后執(zhí)行下面的代碼,文件指針就指向文件的第10個字節(jié):
注意讀寫文件時,文件指針也會改變。在讀取了10個字節(jié)之后,文件指針就指向被讀取的第10個字節(jié)之后的字節(jié)。
也可以規(guī)定負(fù)查找位置,這可以與SeekOrigin.End枚舉值一起使用,查找靠近文件末端的位置。下面的代碼會查找文件中倒數(shù)第5個字節(jié):