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