程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#文件/目錄處理 以及 文件的讀寫

C#文件/目錄處理 以及 文件的讀寫

編輯:C#入門知識

一. 文件處理   C#提供了File和FileInfo類來進行文件處理,兩者的區別是File不能實例化,只提供靜態的方法,適合執行單次的操作,而FileInfo可以實例化;       1. 獲取文件信息(不包含子目錄):   FileInfo myfile = new FileInfo("c:\\abc.txt");   Console.WriteLine(myfile.Attributes);//屬性   Console.WriteLine(myfile.CreationTime);//創建時間   Console.WriteLine(myfile.CreationTimeUtc);//Utc時間   Console.WriteLine(myfile.Directory);//目錄   Console.WriteLine(myfile.DirectoryName);//目錄名字   Console.WriteLine(myfile.Exists);//是否存在   Console.WriteLine(myfile.Extension);文件擴展名   Console.WriteLine(myfile.FullName);//全名   Console.WriteLine(myfile.IsReadOnly);是否只讀   Console.WriteLine(myfile.LastAccessTime);上次訪問   Console.WriteLine(myfile.LastAccessTimeUtc);時間   Console.WriteLine(myfile.LastWriteTime);上次讀入   Console.WriteLine(myfile.LastWriteTimeUtc);時間   Console.WriteLine(myfile.Length);文件長度   Console.WriteLine(myfile.Name);文件名字   Console.WriteLine("以上是實例文件的屬性");       2. 判斷文件是否存在:   FileInfo myfile = new FileInfo("c:\\abc.txt");   if (!myfile.Exists)//判斷文件是否存在       myfile.Create();   或者   if (!File.Exists("c:\\abc.txt"))       File.CreateText(markinfo.strResultFilePath);//File.Create(markinfo.strResultFilePath);       使用Create函數之後打開文件進行讀寫,可能會報The Process cannot access the file because it is being used by another process的異常,這是因為該文件生成之後一直被創建進程所占用,直到進程結束,可以將代碼改為    File.Create(markinfo.strResultFilePath).Close();     3. 打開文件,FileMode 和 FileAccess 枚舉類型   FileMode:     成    員   文 件 存 在   文件不存在   Append   打開文件,流指向文件的末尾,只能與枚舉FileAccess.Write聯合使用   創建一個新文件。只能與枚舉FileAccess.Write聯合使用   Create   刪除該文件,然後創建新文件   創建新文件   CreateNew   拋出異常   創建新文件   Open   打開現有的文件,流指向文件的開頭   拋出異常   OpenOrCreate   打開文件,流指向文件的開頭   創建新文件   Truncate   打開現有文件,清除其內容。流指向文件的開頭,保留文件的初始創建日期   拋出異常       FileAccess:     成   員   說    明   Read   打開文件,用於只讀   Write   打開文件,用於只寫   ReadWrite   打開文件,用於讀寫       File和FileInfo類都提供了OpenRead()和OpenWrite()方法,更易於創建FileStream對象。前者打開了只讀訪 問的文件,後者只允許寫入文件:   FileStream aFile = File.OpenRead("Data.txt"); 或者   FileInfo aFileInfo = new FileInfo("Data.txt"); FileStream aFile = aFile.OpenRead();   4. 讀文件:   對文件進行讀操作可以通過FileStream:     FileStream fs = new FileStream("c:\\abc.txt", FileMode.Create, FileAccess.Write);   fs.Write("Hello!", 0, "Hello!".Length); fs.Close();   或者通過FileStream和StreamReader的組合: FileStream fs = new FileStream("c:\\abc.txt", FileMode.Open); StreamReader sr = new StreamReader(fs); try {      string strLine = "";      strLine = sr.ReadLine();      while(strLine != null)      {           string[] linestrs = strLine.Split();           strLine = sr.ReadLine();      }      sr.Close();      fs.Close(); } catch (IOException ex) {      sr.Close();      fs.Close();      throw ex; }   FileStream對象表示在磁盤或網絡路徑上指向文件的流,操作的是字節和字節數組; 經常使用StreamReader或 StreamWriter執行文件讀寫的功能,因為Stream類操作的是字符數據,字符數據易於使用; 但是有些操作,比如隨機文件訪問(訪問文件中間某點的數據),就必須由FileStream對象執行。   5. 寫文件:   FileStream fs = new FileStream("c:\\abc.txt", FileMode.Open); StreamWriter sw = new StreamWriter(fs); try {      string str = “hello!";        sw.Write( "The 1st Line: ");      sw.WriteLine(str);      sw.Close();      fs.Close(); } catch (IOException ex) {      sw.Close();      fs.Close();      throw ex; }       具體文件定位讀寫的方法參考下面轉載:   1. 文件位置   FileStream類維護內部文件指針,該指針指向文件中進行下一次讀寫操作的位置。在大多數情況下,當打開文件時,它就指向文件的開始位置,但 是此指針可以修改。這允許應用程序在文件的任何位置讀寫,隨機訪問文件,或直接跳到文件的特定位置上。當處理大型文件時,這非常省時,因為馬上可以定位到 正確的位置。   實現此功能的方法是Seek()方法,它有兩個參數:第一個參數規定文件指針以字節為單位的移動距離。第二個參數規定開始計算的起始位置,用SeekOrigin枚舉的一個值表示。Seek Origin枚舉包含3個值:Begin、Current和End。   例如,下面的代碼行將文件指針移動到文件的第8個字節,其起始位置就是文件的第1個字節:       aFile.Seek(8,SeekOrigin.Begin); 下面的代碼行將指針從當前位置開始向前移動2個字節。如果在上面的代碼行之後執行下面的代碼,文件指針就指向文件的第10個字節:       aFile.Seek(2,SeekOrigin.Current); 注意讀寫文件時,文件指針也會改變。在讀取了10個字節之後,文件指針就指向被讀取的第10個字節之後的字節。   也可以規定負查找位置,這可以與SeekOrigin.End枚舉值一起使用,查找靠近文件末端的位置。下面的代碼會查找文件中倒數第5個字節:       aFile.Seek(–5, SeekOrigin.End); 以這種方式訪問的文件有時稱為隨機訪問文件,因為應用程序可以訪問文件中的任何位置。稍後介紹的Stream類可以連續地訪問文件,不允許以這種方式操作文件指針。   2. 讀取數據   使用FileStream類讀取數據不像使用本章後面介紹的StreamReader類讀取數據那樣容易。這是因為FileStream類只能處理 原始字節(raw byte)。處理原始字節的功能使FileStream類可以用於任何數據文件,而不僅僅是文本文件。通過讀取字節數據,FileStream對象可以用 於讀取圖像和聲音的文件。這種靈活性的代價是,不能使用FileStream類將數據直接讀入字符串,而使用StreamReader類卻可以這樣處理。 但是有幾種轉換類可以很容易地將字節數組轉換為字符數組,或者進行相反的操作。   FileStream.Read()方法是從FileStream對象所指向的文件中訪問數據的主要手段。這個方法從文件中讀取數據,再把數據寫入 一個字節數組。它有三個參數:第一個參數是傳輸進來的字節數組,用以接受FileStream對象中的數據。第二個參數是字節數組中開始寫入數據的位置。 它通常是0,表示從數組開端向文件中寫入數據。最後一個參數指定從文件中讀出多少字節。   下面的示例演示了從隨機訪問文件中讀取數據。要讀取的文件實際是為此示例創建的類文件。   試試看:從隨機訪問文件中讀取數據   (1) 在目錄C:/BegVCSharp/Chapter22下創建一個新的控制台應用程序ReadFile。   (2) 在Program.cs文件的頂部添加下面的using指令:       using System; using System.Collections.Generic; using System.Text; using System.IO; (3) 在Main()方法中添加下面的代碼:       static void Main(string[] args) {    byte[] byData = new byte[100];    char[] charData = new Char[100];      try    {       FileStream aFile = new FileStream("http://www.cnblogs.com/Program.cs",FileMode.Open);       aFile.Seek(135,SeekOrigin.Begin);       aFile.Read(byData,0,200);    }    catch(IOException e)    {       Console.WriteLine("An IO exception has been thrown!");       Console.WriteLine(e.ToString());       Console.ReadKey();       return;   }      Decoder d = Encoding.UTF8.GetDecoder();    d.GetChars(byData, 0, byData.Length, charData, 0);      Console.WriteLine(charData);    Console.ReadKey(); } (4) 運行應用程序。        圖 22-2 示例的說明 此應用程序打開自己的.cs文件,用於讀取。它在下面的代碼行中使用..字符串向上逐級導航兩個目錄,找到該文件:       FileStream aFile = new FileStream("http://www.cnblogs.com/Program.cs",FileMode.Open); 下面兩行代碼實現查找工作,並從文件的具體位置讀取字節:          aFile.Seek(135,SeekOrigin.Begin);    aFile.Read(byData,0,200); 第一行代碼將文件指針移動到文件的第135個字節。在Program.cs中,這是namespace的 “n”;其前面的135個字符是using指令和相關的#region。第二行將接下來的200個字節讀入到byData字節數組中。       注意這兩行代碼封裝在try…catch塊中,以處理可能拋出的異常。          try    {       aFile.Seek(135,SeekOrigin.Begin);       aFile.Read(byData,0,100);    }    catch(IOException e)    {       Console.WriteLine("An IO exception has been thrown!");       Console.WriteLine(e.ToString());       Console.ReadKey();       return;   } 文件IO涉及到的所有操作都可以拋出類型為IOException的異常。所有產品代碼都必須包含錯誤處理,尤其是處理文件系統時更是如此。本章的所有示例都具有錯誤處理的基本形式。   從文件中獲取了字節數組後,就需要將其轉換為字符數組,以便在控制台顯示它。為此,使用System.Text命名空間的Decoder類。此類用於將原始字節轉換為更有用的項,比如字符:       Decoder d = Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0); 這些代碼基於UTF8編碼模式創建了Decoder對象。這就是Unicode編碼模式。然後調用GetChars()方法,此方法提取字節數組,將它轉換為字符數組。完成之後,就可以將字符數組輸出到控制台。   3. 寫入數據   向隨機訪問文件中寫入數據的過程與從中讀取數據非常類似。首先需要創建一個字節數組;最簡單的辦法是首先構建要寫入文件的字符數組。然後使用Encoder對象將其轉換為字節數組,其用法非常類似於Decoder。最後調用Write()方法,將字節數組傳送到文件中。   下面構建一個簡單的示例演示其過程。   試試看:將數據寫入隨機訪問文件   (1) 在C:/BegVCSharp/Chapter22目錄下創建一個新的控制台應用程序WriteFile。   (2) 如上所示,在Program.cs文件頂部添加下面的using指令:       using System; using System.Collections.Generic; using System.Text; using System.IO; (3) 在Main()方法中添加下面的代碼:       static void Main(string[] args) {    byte[] byData;    char[] charData;      try    {       FileStream aFile = new FileStream("Temp.txt", FileMode.Create);       charData = "My pink half of the drainpipe.".ToCharArray();       byData = new byte[charData.Length];       Encoder e = Encoding.UTF8.GetEncoder();       e.GetBytes(charData, 0, charData.Length, byData, 0, true);         // Move file pointer to beginning of file.       aFile.Seek(0, SeekOrigin.Begin);       aFile.Write(byData, 0, byData.Length);    }    catch (IOException ex)    {       Console.WriteLine("An IO exception has been thrown!");       Console.WriteLine(ex.ToString());       Console.ReadKey();       return;    } } (4) 運行該應用程序。稍後就將其關閉。   (5) 導航到應用程序目錄 —— 在目錄中已經保存了文件,因為我們使用了相對路徑。目錄位於WriteFile/bin/Debug文件夾。打開Temp.txt文件。          圖 22-3 示例的說明 此應用程序在自己的目錄中打開文件,並在文件中寫入了一個簡單的字符串。在結構上這個示例非常類似於前面的示例,只是用Write()代替了Read(),用Encoder代替了Decoder。   下面的代碼行使用String類的ToCharArray()靜態方法,創建了字符數組。因為C#中的所有事物都是對象,文本“My pink half of the drainpipe.”實際上是一個String對象,所以甚至可以在字符串上調用這些靜態方法。       CharData = " My pink half of the drainpipe. ".ToCharArray(); 下面的代碼行顯示了如何將字符數組轉換為FileStream對象需要的正確字節數組。       Encoder e = Endoding.UTF8.GetEncoder(); e.GetBytes(charData,0,charData.Length, byData,0,true); 這次,要基於UTF8編碼方法來創建Encoder對象。也可以將Unicode用於解碼。這裡在寫入流之前,需要將字符數據編碼為正確的字節格 式。在GetBytes()方法中可以完成這些工作,它可以將字符數組轉換為字節數組,並將字符數組作為第一個參數(本例中的charData),將該數 組中起始位置的下標作為第二個參數(0表示數組的開頭)。第三個參數是要轉換的字符數量(charData.Length,charData數組中的元素 個數)。第四個參數是在其中置入數據的字節數組(byData),第五個參數是在字節數組中開始寫入位置的下標(0表示byData數組的開頭)。   最後一個參數決定在結束後Encoder對象是否應該更新其狀態,即Encoder對象是否仍然保留它原來在字節數組中的內存位置。這有助於以後調 用Encoder對象,但是當只進行單一調用時,這就沒有什麼意義。最後對Encoder的調用必須將此參數設置為true,以清空其內存,釋放對象,用 於垃圾回收。   之後,使用Write()方法向FileStream寫入字節數組就非常簡單:       aFile.Seek(0,SeekOrigin.Begin); aFile.Write(byData,0,byData.Length); 與Read()方法一樣,Write()方法也有三個參數:要寫入的數組,開始寫入的數組下標和要寫入的字節數。     6. 其他文件處理函數(可參考msdn):   File.Copy(源文件地址,目標文件地址, true(為true是覆蓋同名文件));       二. 目錄處理   C#提供了Directory和DirectoryInfo類來進行目錄處理,兩者的區別是Directory不能實例化,只提供靜態的方法,適合執行單次的操作,而DirectoryInfo可以實例化;       1. 獲取目錄下所有文件信息(不包含子目錄):   DirectoryInfo Info = new DirectoryInfo("c:\\"); FileInfo []files = Info.GetFiles();//不包含子目錄 foreach (FileInfo text in files) {     TextBox1.Text += text.Name;     TextBox1.Text +="  "+ text.Length;     TextBox1.Text += "\n"; }        

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved