在.NET框架中進行的全部IO操做都要用到流(Stream)。算法
System.IO命名空間中包含許多IO相關的類,C#文件讀寫的類幾乎都在其中,下面對其進行詳細介紹。數組
主要類列表:網絡
類 | 說明 |
BinaryReader | 用特定編碼將基元數據讀做二進制值。 |
BinaryWriter | 以二進制形式將基元類型寫入流,並支持用特定的編碼寫入字符串 |
BufferedStream | 給另外一流上的讀寫操做添加一個緩衝層。 |
Directory | 靜態實用類,提供用於建立、移動和枚舉目錄和子目錄的靜態方法 |
DirectoryInfo | 表示磁盤上的物理目錄,此類包含處理目錄的實例方法。 |
DriveInfo | 提供有關驅動器信息的訪問。 |
File | 提供用於建立、複製、刪除、移動和打開文件的靜態方法,並協助建立FileStream對象。 |
FileInfo | 提供用於建立、複製、刪除、移動和打開文件的實例方法,並幫助建立FileStream對象。 |
FileStream | 文件Stream對象,既支持同步讀寫文件,也支持異步讀寫操做。 |
FileSystemInfo | FileInfo和DirectoryInfo的基類,根據多態性能夠同時處理文件和目錄 |
MemoryStream | 存儲區爲內存的流。 |
Path | 對包含文件或目錄信息的string執行操做的靜態成員。 |
StreamReader | 實現TextReader,使其以特定編碼從流中讀取字符數據,可使用FileStream將其建立爲基類 |
StreamWriter | 實現TextWriter,使其以特定編碼向流中寫字符數據,可使用FileStream將其建立爲基類 |
StringReader | 實現從字符串進行讀取的TextReader |
StringWriter | 實現一個用於將信息寫入字符串的TextWriter。該信息存儲在StringBuilder中 |
TextReader | 表示可讀取連續字符的讀取器 |
TextWriter | 表示可編寫一個有序字符的編寫器。抽象類。 |
System.MarshalByRefObject | .NET中用於遠程操做的類的基類,它容許在不一樣應用程序之間編組數據。下面的項都在System.IO中。 |
FileSystemWatcher | FileSystemWatcher 用於監控文件和目錄,提供了這些文件和目錄發生變化時應用程序能夠捕獲的事件。框架 |
另外在System.IO.Compression名稱空間的類,可用於GZIP或Deflate壓縮文件的讀寫:異步
從上表能夠看到有多種可用於處理文件IO的流,最重要的類型是FileStream類,它提供了讀寫文件的功能。其餘的還有BufferedStream, CryptoStream, MemoryStream和NetworkStream等。ide
方法 | 說明 |
Copy | 將文件從源位置複製到目標位置 |
Create | 在指定路徑上建立文件 |
Delete | 刪除文件,若是文件不存在,不引起異常 |
Exists | 肯定指定的文件是否存在 |
Move | 將指定文件移動新位置,並提供指定新文件名選項 |
Open | 返回指定路徑上的FileStream對象 |
CreateText | 建立或打開一個文件用於寫入UTF-8文本 |
GetCreationTime | 返回指定文件或目錄的建立日期和時間 |
GetLastAccessTime | 返回上次訪問指定文件或目錄的日期和時間 |
GetLastWriterTime | 返回上次寫入指定文件或目錄的日期和時間 |
OpenRead | 打開現有文件進行讀取 |
OpenText | 打開現有UTF-8文本文件進行讀取 |
OpenWriter | 打開現有文件進行寫入 |
ReadAllBytes | 打開一個文本文件,將文件的內容讀入一個字節數組,而後關閉該文件 |
ReadAllLines | 打開一個文本文件,將文件的全部行讀取一個字符串數組,而後關閉該文件 |
ReadAllText | 打開一個文本文件,將文件的全部內容讀入一個字符串,而後關閉該文件 |
Replace | 使用其餘文件的內容替換指定文件的內容,這一過程將刪除原始文件,並建立被替換文件的備份。 |
FileInfo類和File類有許多方法相同,但不是靜態類,可實例化,用於表示磁盤或網絡位置上的文件。如:函數
FileInfo aFile = new FileInfo("Version.hpp");
FileInfo和File類由許多相似的方法,以下:性能
FileInfo aFile = new FileInfo("Version.hpp"); if(aFile.Exists) Console.WriteLine("File Exists"); if(File.Exists("Version.hpp")) Console.WriteLine("File Exists");
這段代碼檢查文件Version.hpp是否存在,這裏沒有指定目錄信息,此時爲當前工做目錄。ui
什麼使用使用FileInfo,何時使用File,能夠遵循如下原則:編碼
FileInfo類也提供了許多與底層文件相關的屬性,大多屬性繼承於FileSystemInfo,可應用於File和Directory類。FileSystemInfo類的屬性以下:
屬性 | 說明 |
Attributes | 使用FileAttributes枚舉,獲取或設置當前文件或目錄的特性。 |
CreationTime, CreationTimeUtc |
獲取當前文件的建立日期和時間,可使用UTC和非UTC版本 |
Extension | 獲取文件擴展名,只讀屬性 |
Exists | 肯定文件是否存在,只讀屬性,在FileInfo和DirectoryInfo中被重寫 |
FullName | 文件完整路徑,只讀 |
LastAccessTime, LastAccessTimeUtc |
獲取或設置上次訪問當前文件的日期和時間,包含UTC和非UTC版本 |
LastWriteTime, LastWriteTimeUtc |
獲取或設置上次寫入當前文件的日期和時間,包含UTC和非UTC版本 |
Name | 文件完整路徑,只讀抽象屬性,在FileInfo和DirectoryInfo中重寫 |
屬性 | 說明 |
Directory | 包含當前文件的目錄,DirectoryInfo對象,只讀屬性 |
DirectoryName | 文件目錄的路徑,只讀 |
IsReadOnly | 文件只讀屬性的快捷訪問方式。也能夠經過Attributes訪問 |
Length | 獲取文件大小,返回long值,只讀 |
Directory和DirectoryInfo類均可以方便地對文件夾進行操做。
Directory類包含用於文件夾操做的靜態方法。下面是經常使用方法說明:
方法 | 說明 |
CreateDirectory | 建立具備指定路徑的目錄 |
Delete | 刪除指定目錄及其中的全部文件 |
Exists | 肯定指定路徑是否引用現有磁盤上的目錄 |
GetCreationTIme | 獲取指定目錄的建立日期和時間 |
GetDirectories | 返回指定目錄下的子目錄的string名稱數組 |
GetDirectoryRoot | 返回指定路徑的卷信息、根信息。 |
GetFiles | 返回指定目錄下的文件的string名稱數組 |
GetFilesSystemEntries | 返回指定目錄中的文件和子目錄的string名稱數組 |
GetLastAccessTime | 返回上次訪問指定文件或目錄的日期和時間 |
GetLastWriterTime | 上次寫入指定文件或目錄的日期和時間 |
GetParent | 檢索指定路徑的父目錄,包括絕對路徑和相對路徑 |
Move | 將指定的目錄移到新位置。能夠重命名目錄 |
EnumerateDirectories | 與GetDirectories相似,但返回的是目錄名的IEnumerable<string>集合 |
EnumerateFiles | 與GetFiles相似,但返回文件名的IEnumerable<string>集合 |
EnumerateFilesSystemEntries | 與GetFilesSystemEntries相似,但返回IEnumerable<string>對象 |
其中,EnumerateXxx()方法時.NET 4新增的,在存在大量文件或目錄時,其性能比對應的GetXxx()方法好。
DirectoryInfo它表示一個目錄,且和Directory有許多相似方法,選擇規則和使用File,FileInfo同樣:
DirectoryInfo類的大多數屬性繼承自FileSystemInfo,另有兩個專用屬性:
屬性 | 說明 |
Parent | 檢索一個DirectoryInfo對象,表示包含當前目錄的目錄,只讀 |
Root | 檢索一個DirectoryInfo對象,表示當前目錄的根目錄,只讀 |
相對路徑名相對於一個起始位置,當前工做目錄就是起點。例如,若是應用程序運行在C:\Development\FileDemo目錄,並使用相對路徑LogFile.txt,則其絕對路徑爲:C:\Development\FileDemo\LogFile.txt
移到上層目錄,使用..字符串。路徑..\Log.txt,其絕對路徑爲:
C:\Development\LogFile.txt
使用VS時,工做目錄一般爲 ProjectName\bin\Debug,要訪問項目根文件夾中的文件,必須使用..\..\上移兩個目錄。
根據須要,可使用Directory.GetCurrentDirectory()獲取工做目錄,也可使用Directory.SetCurrentDirectory()設置新路徑。
FileStream表示指向文件的流。該類提供了在文件中讀寫字節的方法。不過StreamReader和StreamWriter用的更多,由於它們操做的是字符數據,更易於使用。不過有些操做,如隨機文件訪問,必須使用FileStream。
屬性 | 說明 |
CanRead | 獲取一個用於指示當前流是否支持讀取的值 |
CanSeek | 獲取一個用於指示當前流是否支持查找 |
CanTimeout | 獲取一個用於肯定當前流是否能夠超時 |
CanWrite | 獲取一個用於指示當前流是否支持寫入 |
IsAsync | 獲取一個用於指示FileStream是異步仍是同步打開的值 |
Length | 獲取用字節表示的流長度 |
Name | 獲取傳遞給構造函數的FileStream的名稱 |
Position | 獲取或設置此流的當前位置 |
ReadTimeout | 獲取或設置用於肯定流在超時前嘗試讀取多長時間 |
WriterTimeout | 獲取或設置用於肯定流在超時前嘗試寫入多長時間 |
方法 | 說明 |
BeginRead | 開始異步讀操做 |
BeginWrite | 開始異步寫操做 |
Close | 關閉當前流與釋放資源 |
EndRead | 等待掛起的異步讀取完成 |
EndWrite | 結束異步寫入,在IO操做完成前一直阻止 |
Lock | 容許讀取訪問的同時防止其餘進程更改FileStream |
Read | 從流中讀取字節並將該數據寫入指定緩衝區 |
ReadByte | 從流中讀取一個字節,並將讀取位置提高一個字節 |
Seek | 將該流的當前位置設置爲指定值 |
SetLength | 將該流的長度設置爲指定值 |
Unlock | 雲去其餘進程訪問之前鎖定的某個文件的所有或部分 |
Write | 使用從緩衝區讀取的數據將字節看塊寫入該流 |
WriteByte | 將一個字節寫入文件流的當前位置 |
FileStream aFile = new FileStream(filename, FileMode.Member); FileStream aFile = new FileStream(filename, FileMode.Member, FileAccess.Member);
FileMode枚舉用於指定如何打開或建立文件。FileAccess指定流的做用。
FileAccess枚舉成員:
成員 | 說明 |
Read | 打開文件,用於只讀 |
Write | 打開文件,用於只寫 |
ReadWriter(默認值) | 打開文件,用於讀寫 |
對文件進行非FileAccess枚舉成員指定的操做會拋出異常,該屬性的做用是,基於用於的身份驗證級別提供對應的訪問權限。
FileMode枚舉成員:
成員 | 文件存在 |
Append | 打開文件,流指向文件末尾;若是文件不存在,或建立新文件。只能與FileAccess.Write結合使用。失敗引起ArgumentException. |
Create | 若是文件存在,刪除該文件,而後建立新文件。等效於,若是問及那不存在,則使用CreateNew;否在使用Truncate。 |
CreateNew | 若是文件存在,拋出異常;文件不存在,建立新文件。 |
Open | 打開現有文件,流指向文件開頭。打開文件的能力取決於FileAccess的值。若是文件不存在,引起FileNotFoundException異常。 |
OpenOrCreate | 若是文件存在,打開文件,流指向文件開頭;否在建立新文件。 |
Truncate | 打開現有文件,清除其內容。流指向文件開頭,保留文件的初始建立日期;若是文件不存在,拋出異常。 |
File和FileInfo提供的OpenRead()和OpenWrite()方法,可方便的建立FileStream對象。
FileStream aFile = File.OpenRead("Date.txt"); FileInfo aFileInfo = new FileInfo("Date.txt"); FileStream aFile = aFileInfo.OpenRead();
FileStream類維護文件內部指針,經過Seek()方法,可調整指針位置:
Seek()方法有兩個參數:第一個參數表示指針移動距離(以字節爲單位);第二個參數表示起始位置,以枚舉SeekOrigin表示,SeekOrigin枚舉包含3個值:Begin、Current和End。
例如,下面的代碼將文件指針移動到文件的第8個字節:
aFile.Seek(8, SeekOrigin.Begin);
將指針從當前位置向後移動2個字節,若是在上面的代碼行以後執行,文件指針就指向文件的第10個字節:
aFile.Seek(2, SeekOrigin.Current);
也能夠反向查找,同SeekOrigin.End枚舉值一塊兒使用,查找靠近文件末端的位置。如查找文件倒數第5個字節:
aFile.Seek(-5, SeekOrigin.End);
使用FileStream類讀取數據沒有StreamReader容易,由於FileStream只能處理原始字節。其優勢是能夠處理任何數據文件,而不只限於文本文件。因此FileStream對象可用於讀取圖像、聲音等文件。
FileStream.Read()是FileStream讀取文件的主要方法。它有三個參數:第一個參數爲字節數組,用來接收FileStream對象中的數據;第二個參數時字節數據中開始寫入數據的位置,一般是0;第三個參數指定讀出的字節數目。
byte[] byData = new byte[200]; char[] charData = new char[200]; try { FileStream aFile = new FileStream("../../FileStreamTest.cs", FileMode.Open); aFile.Seek(113, SeekOrigin.Begin); aFile.Read(byData, 0, 200); } catch (Exception e) { Console.WriteLine("An IO exception has been thrown!"); Console.WriteLine(e.ToString()); return; } Decoder d = Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0); Console.WriteLine(charData);
StreamWriter或StreamReader對FileStream進行包裝,直接對文件進行操做,但不能將文件指針改變到任意位置。
屬性 | 說明 |
Encoding | 獲取將輸出寫入到其中的Encoding |
Formatprovider | 獲取控制格式設置的對象 |
NewLine | 獲取或設置當前TextWriter使用的行結束符 |
方法 | 說明 |
Close | 關閉當前的StreamWriter |
Write | 寫入到StreamWriter |
WriteLine | 寫入重載參數指定的某些數據,後跟換行符 |
FileStream aFile = new FileStream("Log.txt", FileMode.OpenOrCreate); StreamWriter sw = new StreamWriter(aFile);
也能夠直接從文件建立:
StreamWriter sw = new StreamWriter("Log.txt",true);
Boolean值的含義:
StreamWriter沒有像FileStream類那樣的FileMode選項,因此要設置這些屬性,需在FileStream中預先設置好,而後以FileStream建立StreamWriter。
using System; using System.Collections.Generic; using System.Ling; using System.Text; using System.IO; namespace Test { public class Program{ static void Main(string[] args){ try { FileStream aFile = new FileStream("Log.txt", FileMode.OpenOrCreate); StreamWriter sw = new StreamWriter(aFile); sw.WriteLine("Hello to you."); sw.WriteLine("It is now {0} and things are looking good.", DateTime.Now.ToLongDateString()); sw.Write("More than that,"); sw.Write(" it's {0} that C# is fun.", true); sw.Close(); } catch (IOException e) { Console.WriteLine(e); } } } }
運行,在項目下的bin\Debug下,能夠找到Log.txt文件。
用於讀取文本文件的專用類,StreamReader能夠從底層Stream對象建立StreamReader實例,並且還能指定編碼。
方法 | 說明 |
Close | 關閉StreamReader |
Read | 讀取輸入字符串中的寫一個字符或下一組字符 |
ReadBlock | 從當前流中讀取最大Count的字符,並從index開始講該數據寫入Buffer |
ReadLine | 讀取一行 |
ReadToEnd | 將整個流或從流的當前位置到流的結尾以字符串讀取。 |
IO流的二進制文件操做主要用到BinaryWriter和BinaryReader類。
BinaryWriter類以二進制形式將數據寫入流,並制定制定編碼
方法 | 說明 |
Close | 關閉當前BinaryWriter |
Seek | 設置當前流的位置 |
Write | 將值寫入流 |
BinaryReader使用特定編碼將數據讀做二進制值。
方法 | 說明 |
Close | 關閉當前流 |
PeekChar | 返回下一個可用的字符,而且不提高字節或字符的位置 |
Read | 從流中讀取字符,並提高流的位置 |
ReadBoolean | 從當前流中讀取Boolean值,並提高位置 |
ReadByte | 讀取下一個字節,提高位置 |
ReadBytes | 讀取count個字節到字節數組,提高count個位置 |
ReadChar | 讀取一個字符,並根據所使用的Encoding和從流中讀取的特定字符,提高位置 |
ReadChars | 從當前流中讀取count個字符,以字符數組的形式返回數據,並根據所使用的Encoding來提高位置 |
ReadInt32 | 從當前流中讀取4字節有符號整數,並提高4字節位置 |
ReadString | 從當前流中讀取一個字符串。 |