本節內容爲文件操做git
文件操做在咱們C#裏仍是比較常見的,例如咱們讀取Excel、Txt文件的內容,在程序中,這些文件都是以流的方式讀取進入咱們內存中,本節內容會詳細的講解有關文件的操做的方法。github
咱們從最大的驅動器開始往文件這個最小的開始講解編程
在Windows操做系統中,存儲介質統稱爲驅動器,硬盤因爲能夠劃分爲多個區域,每個區域稱爲一個驅動器。.NET提供DriveInfo類和 DriveType枚舉型,以方便在程序中直接使用驅動器。DriveInfo類的經常使用字段成員有DriveFormat(文件系統格式,如NTFS或FAT32)、DriveType(驅動器類型)、Name(驅動器名)、TotalSize(總空間)、TotalFreeSpace(得到驅動器可用空間)。經常使用的方法成員有GetDrives(得到可用驅動器列表)。c#
DriveType枚舉型的枚舉值有CDRom(光驅)、Fixed(硬盤)、Network(網絡驅動器)和Removeable(軟盤或U盤)等。例如,如下代碼能夠輸出每個硬盤驅動器的剩餘空間信息。數組
DriveInfo[] drivers = DriveInfo.GetDrives(); foreach(DriveInfo driver in drivers) { if(driver.DriveType == DriveType.Fixed && driver.DriveFormat == "NTFS") { Console.WriteLine("在{0}驅動器上還有{1}字節的剩餘空間。", driver.Name, driver.AvailableFreeSpace); } } Console.ReadLine();
爲了方便檢索文件,須要在驅動器中先建立目錄,而後把文件保存到這個目錄中。在Windows操做系統中,目錄又稱文件夾。每一個驅動器都有一個根目錄,使用」\」表示,如」C:\」表示C驅動器的根目錄。建立在根目錄中的目錄稱爲一級子目錄。在一級子目錄中建立的目錄稱爲二級子目錄,依此類推。文件系統的目錄結構是一種樹形結構。瀏覽器
.NET提供了Directory類和DirectoryInfo類,以方便在程序中直接操做目錄。緩存
Directory類的經常使用方法成員有CreateDirectory(建立新目錄)、Delete(刪除目錄)、Exists(判斷目錄是否存在)、Move(移動目錄)、GetFiles(得到目錄的文件列表)、GetDirectories(得到子目錄列表)等。網絡
DirectoryInfo類的經常使用字段成員有Name(提取目錄名)、Exists(判斷目錄是否存在)、Parent(父目錄)、Root(根目錄)、MoveTo(移動目錄)、GetFiles(得到目錄的文件列表)、GetDirectories(得到子目錄列表)等。例如,如下代碼分別展示了Directory類和DirectoryInfo類的基本方法。數據結構
Directory.CreateDirectory(@"d:\C#程序設計"); if(Directory.Exists(@"d:\C#程序設計")) { Console.WriteLine("建立成功"); } Directory.Delete(@"d:\C#程序設計"); if (!Directory.Exists(@"d:\C#程序設計")) { Console.WriteLine("刪除成功"); } DirectoryInfo dir = new DirectoryInfo(@"d:\C#程序設計"); if (!dir.Exists) { dir.Create(); } else { Console.WriteLine("該目錄已經存在"); }
文件的操做主要是分爲兩個類,一個是File類,一個是FileInfo類。File和FileInfo類位於System.IO命名空間,均可以用來實現建立、複製、移動、打開文件等操做。File類和FileInfo類與Directory類和DirectoryInfo類的工做方式類似。File類是一個靜態類,可直接調用其方法成員。FileInfo類不是靜態類,須要先建立實例。異步
File類是一個文件的基本操做類,提供用於建立、複製、刪除、移動和打開文件的靜態方法,並協助建立 FileStream 對象。裏面包含的大多都是實際操做文件的方法,我用一個列表表示它內部經常使用的方法
這些方法的使用也是很是簡單,例如:
string path = @"E:\test.txt"; //以路徑爲參數建立文件 File.Create(path);
更多的使用你最好本身去嘗試,咱們這幾節的內容都是一些經常使用的類和方法的實際運用,並無過多的知識點,你只須要按着這裏的操做一直嘗試便可。
FileInfo類也能夠對文件進行操做,文件信息類FileInfo與File類不一樣,它雖然也提供類建立、複製、刪除、移動和打開文件的方法,而且幫助建立FileStream對象,可是它提供的僅僅是實例方法他是咱們最經常使用的文件操做類。
它裏面含有的屬性有:
經常使用的方法和File類相似,這裏添加幾個以前沒有講過的
與文件類File和文件夾類Directory相比,文件信息類FileInfo和文件夾信息類DirectoryInfo具備其大部分功能。
文件流對咱們而言是一個陌生的概念,事實上,你仔細思考一下,咱們是如何經過File類和FileInfo類讀取文件中的內容呢?它其實就是以文件流的形式進行讀寫。流包括如下基本操做:
在C#中,全部的流操做都繼承於Stream類,Stream類的主要屬性有
主要方法有
文件流類FileStream以流的形式讀、寫、打開、關閉文件。另外,它還能夠用來操做諸如:管道、標準輸入/輸出等其餘與文件相關的操做系統句柄。
內存流MemoryStream類用來在內存中建立流,以暫時保持數據,所以有了它就無須在硬盤上建立臨時文件。它將數據封裝爲無符號的字節序列,能夠直接進行讀、寫、查找操做。
緩衝流BufferedStream類表示把流先添加到緩衝區,再進行數據的讀/寫操做。緩衝區是存儲區中用來緩存數據的字節塊。使用緩衝區能夠減小訪問數據時對操做系統的調用次數,加強系統的讀/寫功能。
注意,FileStream類也有緩衝功能,在建立FileStream類的實例時,只須要指定緩衝區的大小便可。
示例
//要寫入文件的字符數組 char[] m_cDataWrite = new char[100]; //包含要寫入該流的數據的緩衝區 byte[] m_bDataWrite = new byte[100]; try { //建立d:\file.txt的FileStream對象 FileStream m_FileStream = new FileStream(@"d:\file.txt", FileMode.OpenOrCreate); //將要寫入的字符串轉換成字符數組 m_cDataWrite = "test filestream".ToCharArray(); //經過UTF-8編碼方法將字符數組轉成字節數組 Encoder m_Enc = Encoding.UTF8.GetEncoder(); m_Enc.GetBytes(m_cDataWrite, 0, m_cDataWrite.Length, m_bDataWrite, 0, true); //設置流當前位置爲文件開始位置 m_FileStream.Seek(0, SeekOrigin.Begin); //將字節數組中的內容寫入文件 m_FileStream.Write(m_bDataWrite, 0, m_bDataWrite.Length); if (m_FileStream != null) { //清除此流的緩衝區,使得全部緩衝的數據都寫入到文件中 m_FileStream.Flush(); m_FileStream.Close(); } } catch (Exception ex) { Console.WriteLine("There is an IOException"); Console.WriteLine(ex.Message); } Console.WriteLine("Write to File Succeed!");
流讀取器StreamReader類用來以一種特定的編碼(如:UTF-8)從字節流中讀取字符,流寫入器StreamWriter類用來以一種特定的編碼(如:UTF-8)向流中寫入字符。StreamReader和StreamWriter類通常用來操做文本文件。
示例
try { //保留文件現有數據,以追加寫入的方式打開d:\file.txt文件 StreamWriter m_SW = new StreamWriter(@"d:\file.txt", true); //向文件寫入新字符串,並關閉StreamWriter m_SW.WriteLine("Another File Operation Method"); m_SW.Close(); } catch (Exception ex) { Console.WriteLine("There is an IOException"); Console.WriteLine(ex.Message); } StreamWriter類提供了另外一種從文件中讀取數據的方法,下面演示其用法: try { //以絕對路徑方式構造新的StreamReader對象 StreamReader m_SR = new StreamReader(@"d:\file.txt"); //用ReadToEnd方法將d:\file.txt中的數據所有讀入到字符串m_Data中,並關閉StreamReader string m_Data = m_SR.ReadToEnd(); m_SR.Close(); Console.WriteLine(m_Data); } catch (Exception ex) { Console.WriteLine("There is an IOException"); Console.WriteLine(ex.Message); }
BinaryReader類用特定的編碼將基元數據類型讀做二進制。BinaryWriter類以二進制形式將基元類型寫入流,並支持用特定的編碼寫入字符串。若是你須要查看寫入的內容,你須要使用專門的二進制瀏覽器而不是記事本
示例
FileStream m_FS = new FileStream(@"d:\data.dat", FileMode.Create); //經過文件流建立相應的BinaryWriter BinaryWriter m_BW = new BinaryWriter(m_FS); for(int i = 0; i < 11; i++) { //向d:\data.dat中寫入數據 m_BW.Write((int)i); } m_BW.Close(); m_FS.Close(); FileStream m_FS = new FileStream(@"d:\data.dat", FileMode.Open, FileAccess.Read); //經過文件流建立相應的BinaryReader BinaryReader m_BR = new BinaryReader(m_FS); //從d:\data.dat中讀取數據 for(int i = 0; i < 11; i++) { Console.WriteLine(m_BR.ReadInt32()); } m_BR.Close(); m_FS.Close(); Console.ReadLine();
《c# 編程兵書》第11章 張志強 胡君 編著
若是個人文章幫助了您,請您在github.NETCoreGuide項目幫我點一個star,在博客園中點一個關注和推薦。