c#文件操作

在.NET Framework中進行的所有的輸入和輸出工作都要使用到流。流是串行化設備的抽象串行化設備可以以線性方式存儲數據,並可以以同樣的方式訪問:一次訪問—個字節。此設備可以是磁盤文件、打印機、內存位置和或任何其他支持以線性方式讀寫的對象。

當向某些外部目標寫數據時,就要用到輸出流,這可以是物理磁盤文件、網絡位置、打印機或其他程序。

 

常用的類:

File------實用類,提供許多靜態方法,用於移動、刪除、和複製文件。

Directory------實用類,提供許多靜態方法,用於移動、刪除和複製目錄。

Path------ 實用類,用於處理路徑名稱。

FileInfo------表示磁盤上的物理文件,具有可以處理此文件的方法,要完成對文件的讀寫工作,就必須創建Stream對像。

DirectoryInfo------表示磁盤上的物理目錄,具有可以處理此目錄的方法

FileStream-------表示可以被寫或被讀,或二者都可的文件,此文件可以同步或異步讀和寫

StreamReader------從流中讀取字符數據,並可通過使用FileStream被創建爲基類。

StreamWriter------向流寫字符數據,可通過使用FileStream被創建爲基類。

FileSystemWatcher---- FileSystemWatcher是用於監控文件和目錄,並在這些位置發生變化時,給出應用程序可以捕獲的事件。

 

 

◆File和Directory類

作爲實用類,File和Directory類都提供了許多方法,用於處理文件系統以及其中的文件和目錄。這些是靜態方法,涉及移動文件、查詢和更新屬性並創建FileStream對象。

File類一些最常用的靜態方法:

Copy()------將文件複製到規定的位置

Create()------在規定的恢蒙洗脣ㄎ募?/FONT>

Delete()------刪除文件

Open()-------在規定的路徑上返回FileStream對像

Move()------將規定的文件移動到新位置,可以在新位置給文件規定不同的名字

 

Directory類的一些常用的靜態方法

CreateDirectory()------創建具有規定路徑的目錄

Delete()------刪除規定的目錄以及其中的所有文件

GetDirectories()------返回表示當前目錄之下的目錄的Directory對像的數組

GetFiles()-------返回在當前目錄中的File對像的數組

Move()------將規定的目錄移動到新位置。可以在新位置爲文件夾規定一個新名稱

 

FileInfo 類

FileInfo類不像File類,它沒有靜態方法,僅可用於實例化的對像。FileInfo對像表示在磁盤或網絡位置的文件,注意它不是流,爲了讀寫文件,必須創建Stream對像。

fileInfo類提供了下面的關於基礎性的文件的屬性,這些屬性可能用來更新文件。

Attributes-----獲取或設置當前文件的屬性

CreationTime------獲取當前文件的創建日期和時間

DirectoryName------獲取文件目錄的路徑

Exists------判斷是否存在文件

FullName------檢索文件的完整路徑

Length------獲取文件的容量

Name------僅僅返回文件的名稱,而不是完整的文件位置路徑、

 

       當在.NET代碼中規定路徑名時,您可以使用絕對路徑名,也可以使用相對路行名。絕對路徑名顯式地規定文件或目錄來自於哪—個己知的位置——比如是c:驅動器。它的—個範例是C:\work\LogFile.txt。注意它淮確地定義了其位置。

  相對路徑名相對於應用程序在文件系統上運行的位置。通過使用相對路徑名稱,無需規定已知的驅動器或位置;當前的目錄就是起點。例如,如果應用程序運行在c:\DeVelopment\FileDemo目錄上(這裏的應用程序是指代碼生成後的exe文件),並使用了相對路徑“LogFile.txt,”,則該文件就位於C:\DeVelopment/FileDemo/LogFile.txt中。爲了上移目錄,則使用.. 字符。這樣,在同一個應用程中路徑“../test.txt”是指向應用程序所在的目錄的上一級目錄裏的文件test.txt。

 

 

◆FileStream對象

FileStream對象表示在磁盤或網絡路徑上指向文件的流。當類提供向文件讀寫字節的方法時,經常使用StreamReader或StreamWriter執行這些功能。這是因爲FileStream類操作字節和字節數組,而Stream類操作字符數據。字符數據易於使用,但是有些操作比如隨機文件訪問,就必須由FileStream對象執行。

FileStream對象的構造函數:

FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);

FileMode枚舉具有幾種成員:

Append------如果文件存在,就打開文件,將文件位置移動到文件的末尾,並創建一個新文件。FileMode.Append僅可以與枚舉FileAccess.Write聯合使用

Create------創建新文件;如果存在這樣的文件,就破壞它。

CreateNew------創建新文件,但是如果已經存在此文件,則拋出異常

Open------打開現有的文件,但是不存在所指定的文件,則拋出異常

OpenOrCreate------如果文件存在,則規定打開文件,否則就創建新文件,如果文件已經存在,則保留在文件中的數據

Truncate------打開現有文件,清除其內容,然後我們可以向文件寫入全新的數據,但是保留文件的初始創建日期,必須存在有文件,否則就拋出異常

 

訪問級別

 前面的構造函數默認以只讀模式打開文件,需要一個附加參數規定不同的訪問級別,此參數是FileAccess參數。

FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)

        FileAccess枚舉有三種類型:Read、Write、ReadWrite.此屬性的作用是:基於用戶的身份驗證級別改變用戶對文件的訪問

 

 讀取文件的位置用seek:public long Seek(long offset,SeekOrigin origin)

Long offset是規定文件指針以字節爲單位的移動距離;SeekOrigin origin是規定開始計算的起始位置,此枚舉包含3個值:Begin,Current和End。

   例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是文件指針從文件的第一個字節起;而參數‘8‘指得是移動到文件的第8個字節

   例2:afile.Seek(2,SeekOrigin.Current)//在當前位置開始,再移動2個字節。

   例3:aFile.Seek(-5,SeekOrigin.End)//在文件末端位置開始,倒數5個字節。


     讀取數據

使用FileStream類讀取數據不像使用StreamReader和StreamWriter類讀取數據那麼容易,這是因爲FileStream類只能處理原始字節(raw byey),這使得FileStream類可以用於任何數據文件,而不僅僅是文本文件,通過讀取字節數據就可以讀取類似圖像和聲音的文件。這種靈活性的代價是不能使用它直接讀入字符串,而使用StreamWriter和StreaMeader類卻可以這樣處理,從是有幾種轉換類可以很容易地將字節數組轉換爲字符數組,或者進行相反的操作。

Read()方法是從FileStream對象所指向的文件訪問數據的主要手段:

Public int Read(byte[] array,int offset, int count)//第一個參數是被傳輸進來的字節數組,用以接受FileStream對象中的數據。第二個參數是字節數組中開始寫入數據的位置,它通常是0,表示從數組的開端的文件中向數組寫數據,最後一個參數是規定從文件中讀出多少字節。

寫入數據

寫入數據的流程是先獲取字節數組,再把字節數據轉換爲字符數組,然後把這個字符數組用Write()方法寫入到文件中,當然在寫入的過程中,可以確定在文件的什麼位置寫入,寫多少字符等等。

 

文件讀寫的範例:


讀取文件
 using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace myFile
{
       class Program
       {
           static void Main(string[] args)
           {
               byte[] byData = new byte[100];//建立一個FileStream要用的字節組
               char[] charData = new char[100];//建立一個字符組

               try
               {
                   FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//實例化一個FileStream對象,用來操作data.txt文件,操作類型是
                
                   aFile.Seek(55, SeekOrigin.Begin);//把文件指針指向,從文件開始位置向前55位字節所指的字節
                   aFile.Read(byData, 0, 100);//讀取FileStream對象所指的文件到字節數組裏
               }
               catch (IOException e)
               {
                   Console.WriteLine("close");
                   return;
               }
               Decoder d = Encoding.UTF8.GetDecoder();//
               d.GetChars(byData, 0, byData.Length, charData, 0);//將編碼字節數組轉換爲字符數組

               Console.WriteLine(charData);
               Console.ReadLine();
               return;
           }
       }
}

寫入文件:


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace myFile
{
       class Program
       {
           static void Main(string[] args)
           {
               byte[] byData = new byte[100];//建立一個FileStream要用的字節組
               char[] charData = new char[100];//建立一個字符組

               try
               {
                   FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//實例化一個FileStream對象,用來操作data.txt文件,操作類型是
               
                   charData = "我是誰?111?".ToCharArray();//將字符串內的字符複製到字符組裏
                   aFile.Seek(0, SeekOrigin.End);
                   Encoder el = Encoding.UTF8.GetEncoder();//編碼器
                   el.GetBytes(charData, 0, charData.Length, byData, 0, true);

                   aFile.Write(byData, 0, byData.Length);
               }
               catch (IOException e)
               {
                   Console.WriteLine("close");
                   return;
               }
           
           }
       }
}

  
◆StreamWriter對像

 

用FileWriter來隨機讀取文件是個好主意,而用StreamWriter可以直接把字符串寫入文件中,它處理重要的轉換和向FileStream對像寫入工作。創建StreamWriter有很多方法:

FileStream aFile = new FileStream(“Log.txt”,FileMode.CreatcNew);

StreamWriter sw = new StreamWriter(aFile);

也可直接從文件中創建StreamWriter對象:

  StreamWriter sw = new StreamWriter(“Log.txt”,true);

       後面這個Boolean值規定是附加文件還是創建新文件,如果此值爲false,則就創建一個新文件,或者截取現有文件並打開它。如果此值設置爲true,則打開文件,保留原來的數據,如果找不到文件,則創建一個新文件。注意:當創建FileStream對象時,您無法得到選項的範圍。除了使用Boolean值附加或創建新文件外,我們根本就無法像使用FileStream類時那樣規定FileMode屬性;而且,您也無法設置FileAccess屬性.因此您總是具有對文件的讀寫特權,爲了使用任何高級參數,您必須在FileStream構造函數中規定這些參數,然後在FileStream對象中創建StreamWriter。


例:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace StreamWriterFile
{
       class Program
       {
           static void Main(string[] args)
           {
               try
               {
                   FileStream aFile = new FileStream("data1.txt", FileMode.OpenOrCreate);//建立一個fileStream對象
                   StreamWriter sw = new StreamWriter(aFile);//用FileStream對像實例一個StreamWriter對象
               
                   sw.Write("first.");
                   sw.WriteLine("hello world!!!");//寫入字符串,方法WriteLine寫入時後面跟一個換行符
                   sw.Write("This is a");//寫入字符串,方法Write寫入時沒有換行符
                   sw.Write("string of characters.");
                   sw.Close();//用完後必須關閉對像
               }
               catch (IOException e)
               {
                   Console.WriteLine(e.ToString());
               }
           }
       }
}

  
◆StreamReader對象

 

1.讀取文件

輸入流用於從外部源讀取數據,在很多情況下,數據源可以是磁盤上的文件或網絡的某些位置,任何可能發送數據的位置都可以是數據源,比如網絡應用程序,web服務,甚至是控制檯。StreamReader是一個通用類,可以用於任何流;StreamReader對象的創建方式非常類似於StreamWriter對象的創建方式。

StreamWriter類有兩個基本的方法read和readLine

Read()方法將流的下一個字符作爲正整數值返回,如果到達了流的結尾處,則返回-1

ReadLing()方法是讀取並返回一行字符,如果返回爲空,那麼就是到達了流的結尾。

ReadEnd()方法讀小文件最好,它直接讀取完整的文件並作爲字符串返回。


例:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace StreamReaderTest
{
       class Program
       {
        
           static void Main(string[] args)
           {
               string strLine;
               try
               {
                   Console.Write("請輸入文件路徑及文件名:");
                   string mess = Console.ReadLine();
                   FileStream aFile = new FileStream(mess, FileMode.Open);
                   StreamReader sr = new StreamReader(aFile);//用FileStream對象實例化一個StreamReader對象
                   //strLine = sr.ReadToEnd();//讀取完整的文件,如果用這個方法,就可以不用下面的while循環
                   strLine = sr.ReadLine();//     讀取一行字符並返回
                   while (strLine != null)
                   {
                       Console.WriteLine(strLine);
                       strLine = sr.ReadLine();
                   }
                   sr.Close();
                   Console.ReadLine();
               }
               catch (IOException e)
               {
                   Console.WriteLine("an IOexception has been thrown!");
                   Console.WriteLine(e.ToString());
                   return;
               }
               return;
           }
       }
}

  
2.分隔文件

讀取使用逗號分隔的文件,string類提供了一種稱爲Split()的方法,可以用於將字符串按照提供的分隔符分隔成字符組.


例:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace CommaValues
{
       class Program
       {
           static void Main(string[] args)
           {
               while (true)
               {
                   string strLine;
                   string[] strArray;
                   char[] charArray = new Char[] { ',' };
                   Console.Write("請輸入文件內容以逗號分隔的文件路徑及文件名:");
                   string name = Console.ReadLine();

                   try
                   {
                       FileStream aFile = new FileStream(name, FileMode.Open);
                       StreamReader sr = new StreamReader(aFile);

                       strLine = sr.ReadLine();
                       while (strLine != null)
                       {
                           strArray = strLine.Split(charArray);
                           for (int x = 0; x <= strArray.GetUpperBound(0); x++)
                           {
                               Console.WriteLine(strArray[x].Trim());
                           }
                           strLine = sr.ReadLine();
                       }
                       sr.Close();
                       //Console.ReadLine();
                   }
                   catch (IOException e)
                   {
                       Console.WriteLine(e.ToString());
                       return;
                   }
                   //return;
               }
           }
       }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章