文件是一些永久存儲及具備特定順序的字節組成的一個有序的,具備名稱的集合。與文件有關的概念是目錄路徑和磁盤存儲等。流提供了一種向後備存儲寫入字節和從後備存儲讀取字節的方式。後備存儲包裹用文件存儲或用內存(數組)存儲,以及網絡,CD等。程序員
基本文件的I/Oc#
命名空間爲System.I/O,程序集爲mscorlib(在mscorlib.dll中)
抽象基類Stream支持讀取和寫入字節。Stream集成了異步支持,其默認實現根據其相應的異步方法來定義同步讀取和寫入。
全部表示流的類都是從Stream類繼承的。Stream類及其派生類提供數據源和存儲庫的通常視圖,使程序員沒必要了解操做系統和基礎設備的具體細節。
流涉及3個基本操做:從流讀取,向流寫入以及查找和修改流內當前位置。根據基礎數據源或存儲庫,流可能只支持這些功能中的一部分。例如,NetworkStream不支持查找。Stream的CanRead,CanWrite和CanSeek屬性及其派生類決定不一樣的流所支持的操做。數組
Stream類安全
stream是全部流的抽象基類。流是字節序列的抽象概念,如文件,輸入輸出設備,內部進程通訊管道或TCP/IP套接字。Stream類及其派生類提供這些不一樣類型的輸入輸出的通常視圖,使程序員沒必要了解操做系統和基礎設備的具體細節。
若是用MemoryStream初始化流,流的後備存儲是內存,容量隨數據動態的增長。若是用FileStream初始化流,流的後備存儲是文件,對流的操做視同對文件的操做。網絡
下面的例子使用Stream..WriteByte和Stream..Read寫入和讀取數據塊異步
using System; using System.IO; public class Block { public static void main() { Stream s=new MemoryStream();//產生一個流,它的後備存儲是內存 //將一個字節寫入流內的當前位置,位置推動一個字節 for(int i=0;i<100;i++) { s.WtriteByte((byte)i); } s.Positon=0;//流中位置設置爲0 byte[]betes=new byte[1000]; //請求從流中讀取的最大字節數等於流的長度 int numBytesToRead=(int)s.Length; int numBytesRead=0;//偏移量設置爲0 while(numBytesToRead>0) { //s.Read從當前流讀取字節序列,並將此流中的位置提高讀取的字節數 //返回值n是實際讀取的字節數,若是已到達流的末尾則爲零(0) int n=s.Read( bytes, //數組bytes接收從流中讀取的字節 numBytesRead, //數組bytes的偏移量,從偏移量開始存儲數據 numBytesToRead);//請求讀取的最大字節數 if(n==0) { break; } numBytesRead+=n; numBytesToRead-=n; } s.Close(); //如今請求讀取的字節數numBytesToRead爲0,偏移量numBytesRead應該爲100 Console.WriteLine("number of bytes read:"+numBytesRead); } }
輸出以下所示:函數
number of bytes read:100
=======================================================編碼
File類
file類提供用於建立,複製,刪除,移動和打開文件的靜態方法,並協助建立FileStream對象。也可將File類用於獲取和設置文件屬性或有關文件建立,訪問及寫入操做的DateTime信息。因爲全部的File方法都是靜態的,所以若是隻想執行一個操做,則使用File方法的效果比使用相應的FileInfo實例方法可能更高 下面演示File類的一些主要成員。代碼中使用Using語句定義一個範圍。將下面的代碼放入Main方法。spa
string path=@"..\...\MyTest.txt";//MyTest.txt位於項目的文件夾 if(!File.Exits(path)) { //using語句用於定義一個範圍,再次範圍的末尾將釋放對象sw //StreamWriter實現一個TextWriter,使其以特定的編碼UTF-8向流中寫入字符 //File.CreateText建立或打開一個文件用於寫入UTF-8編碼的文本 using(StreamWriter sw=FIle.CreateText(path)) { sw.WriteLine("Hello"); sw.WriteLine("AND"); sw.WriteLine("Welcome"); } } //使用StreamReader讀取標準文本文件的各行信息 using (StreamReader sr=File.OpenText(path)) { string s=""; //從當前的流中讀出一行字符將數據做爲字符串返回 while((s=sr.ReadLine())!=null) { //顯示Mytext.txt的內容「Hello/And/Welcome」到屏幕 Console.WriteLine(s); } } try { string path2=path+"temp"; File.Delete(path2);//確保目標文件不存在 File.Copy(path,path2);//複製文件 Console.WriteLine("{0}was copied to {1}",path,path2); File.Delete(path2); Console.WriteLine("{0}was successfully deleted.",path2); } catch(Exception e) { Console.WriteLine("The process failed:{0}",e.ToString()); }
運行結果爲程序在本項目文件夾創建一個文本文件MyText.txt,屏幕顯示爲:操作系統
Hello/And/Welcome
..\..\myTest.txt was copied to..\..\myTest.txttemp
..\..\myTest.txt was successfully deleted
======================================================
FileInfo類
FileInfo類提供建立,複製,刪除,移動和打開文件的實例方法,而且幫助建立FileStream對象,若是打算屢次重用某個對象,可考慮使用FileInfo的實例方法,而不是File類的相對靜態方法,之內並不老是須要安全檢查
下面的例子是使用FileInfo構造函數建立兩個文件,並接着對其進行寫入,讀取,複製和刪除操做
string path=@"..\..\MyText.txt" FileInfo fil=new FileInfo(path);//FileInfo提供的方法是非靜態方法,必須實例化 if(!fil.Exists) { using(StreamWriter sw=fil.CreaterText()) { sw.WriteLine("Hello"); sw.WriteLine("And"); sw.WriteLine("Welcome"); } } using(StreamReader sr=fil.OpenText()) { string s=""; while((s=sr.ReadLine())!=null) Console.WriteLine(s); } try { string path2=path+"temp"; FileInfo fi2=new FileInfo(path2); fi2.Delete();//確保目標文件不存在 fi1.CopyTo(path2);//複製文件 Console.WriteLine("{0}was copied to {1}",path,path2); fi2.Delete(); Console.WriteLine("{0}was successfully deleted",path2); } catch(Exception e) { Console.WriteLine("The process failed:{0}",e.Tostring()); }
運行輸出結果爲:
Hello/And/Welcome
..\..\myTest.txt was copied to..\..\myTest.txttemp
..\..\myTest.txt was successfully deleted
下面的一個例子是顯示FileInfo的一些主要成員:
//建立磁盤上給你惟一命名的零字節的臨時文件並返回該文件的完整路徑 //此方法建立帶.TMP文件拓展名的臨時文件 string path=Path.GetTempFileName(); //初始化FileInfo類的新實例,它做爲文件路徑的包裝 FileInfo fil=new FileInfo(path); if(!fil.Exists) { //fil.CreateText建立吸入新文本文件的StreamWriter //默認狀況下,將向全部用戶授予對於新文件的徹底讀寫訪問權限 using(StreamWriter sw=fil.CreateText()) { sw.WriteLine("Hello"); sw.WriteLine("And"); sw.WriteLine("Welcome"); } } using(StreamReader sr=fil.OpenText())//打開文件讀取 { string s=""; while((s=sr.ReadLine())!=null) Console.WriteLine(s); } try { string path2=Path.GetTempFileName(); FileInfo fi2=new FileInfo(path2); fi2.Delete(); fi1.CopyTo(path2); Console.WriteLine("{0}was copied to{1}",path,path2); fi2.Delete(); Console.WriteLine("{0}was successfully deleted.",path2) } catch(Exception e) { Console.WriteLine("The process failed:{0}",e.ToString()); }
輸出結果以下:
C:\Documents and Settings\Administrator\Local Settings\temp\Temp10.tmp was copied to
C:\Documents and Settings\Administrator\Local Settings\temp\Temp11.tmp
C:\Documents and Settings\Administrator\Local Settings\temp\Temp11.tmp was successfully deleted