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

C# IO,

編輯:C#入門知識

C# IO,


在.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壓縮文件的讀寫:

  • DeflateStream——使用Deflate算法實現自動壓縮或解壓縮的文件流。
  • GZipStream——使用GZIP算法實現自動壓縮或解壓縮的文件流。

從上表可以看到有多種可用於處理文件IO的流,最重要的類型是FileStream類,它提供了讀寫文件的功能。其他的還有BufferedStream, CryptoStream, MemoryStream和NetworkStream等。

File類

方法 說明 Copy 將文件從源位置復制到目標位置 Create 在指定路徑上創建文件 Delete 刪除文件,如果文件不存在,不引發異常 Exists 確定指定的文件是否存在 Move 將指定文件移動新位置,並提供指定新文件名選項 Open 返回指定路徑上的FileStream對象 CreateText 創建或打開一個文件用於寫入UTF-8文本 GetCreationTime 返回指定文件或目錄的創建日期和時間 GetLastAccessTime 返回上次訪問指定文件或目錄的日期和時間 GetLastWriterTime 返回上次寫入指定文件或目錄的日期和時間 OpenRead 打開現有文件進行讀取 OpenText 打開現有UTF-8文本文件進行讀取 OpenWriter 打開現有文件進行寫入 ReadAllBytes 打開一個文本文件,將文件的內容讀入一個字節數組,然後關閉該文件 ReadAllLines 打開一個文本文件,將文件的所有行讀取一個字符串數組,然後關閉該文件 ReadAllText 打開一個文本文件,將文件的所有內容讀入一個字符串,然後關閉該文件 Replace 使用其他文件的內容替換指定文件的內容,這一過程將刪除原始文件,並創建被替換文件的備份。

 

FileInfo

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是否存在,這裡沒有指定目錄信息,此時為當前工作目錄。

什麼使用使用FileInfo,什麼時候使用File,可以遵循以下原則:

  • 如果僅進行單一方法調用,則可以使用靜態File類。此時,單一調用要快i一些,因為不必實例化新對象。
  • 如果要在文件上執行幾種操作,則實例化FileInfo對象並使用其方法更好一些。這樣比較節省時間,因為對象已在文件系統上引用正確文件,而靜態類必須每次都尋找文件。

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中重寫

 

FileInfo專用屬性

屬性 說明 Directory 包含當前文件的目錄,DirectoryInfo對象,只讀屬性 DirectoryName 文件目錄的路徑,只讀 IsReadOnly 文件只讀屬性的快捷訪問方式。也可以通過Attributes訪問 Length 獲取文件大小,返回long值,只讀

 

Directory類

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

DirectoryInfo它表示一個目錄,且和Directory有許多類似方法,選擇規則和使用File,FileInfo一樣:

  • 單一調用,使用靜態類Directory
  • 進行系列調用,使用DirectoryInfo

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

FileStream表示指向文件的流。該類提供了在文件中讀寫字節的方法。不過StreamReader和StreamWriter用的更多,因為它們操作的是字符數據,更易於使用。不過有些操作,如隨機文件訪問,必須使用FileStream。

FileStream常用屬性

屬性 說明 CanRead 獲取一個用於指示當前流是否支持讀取的值 CanSeek 獲取一個用於指示當前流是否支持查找 CanTimeout 獲取一個用於確定當前流是否可以超時 CanWrite 獲取一個用於指示當前流是否支持寫入 IsAsync 獲取一個用於指示FileStream是異步還是同步打開的值 Length 獲取用字節表示的流長度 Name 獲取傳遞給構造函數的FileStream的名稱 Position 獲取或設置此流的當前位置 ReadTimeout 獲取或設置用於確定流在超時前嘗試讀取多長時間 WriterTimeout 獲取或設置用於確定流在超時前嘗試寫入多長時間

FileStream常用方法

方法 說明 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

StreamWriter或StreamReader對FileStream進行包裝,直接對文件進行操作,但不能將文件指針改變到任意位置。

StreamWriter常用屬性

屬性 說明 Encoding 獲取將輸出寫入到其中的Encoding Formatprovider 獲取控制格式設置的對象 NewLine 獲取或設置當前TextWriter使用的行結束符

StreamWriter常用方法

方法 說明 Close 關閉當前的StreamWriter Write 寫入到StreamWriter WriteLine 寫入重載參數指定的某些數據,後跟換行符

創建StreamWriter:

FileStream aFile = new FileStream("Log.txt", FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(aFile);

也可以直接從文件創建:

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

Boolean值的含義:

  • false,創建新問及那,或者截取現有文件並打開。
  • true,打開文件,保留原數據。如果找不到文件,則創建新文件。

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

用於讀取文本文件的專用類,StreamReader可以從底層Stream對象創建StreamReader實例,而且還能指定編碼。

StreamReader常用方法

方法 說明 Close 關閉StreamReader Read 讀取輸入字符串中的寫一個字符或下一組字符 ReadBlock 從當前流中讀取最大Count的字符,並從index開始講該數據寫入Buffer ReadLine 讀取一行 ReadToEnd 將整個流或從流的當前位置到流的結尾以字符串讀取。

 

二進制文件操作

IO流的二進制文件操作主要用到BinaryWriter和BinaryReader類。

BinaryWriter

BinaryWriter類以二進制形式將數據寫入流,並制定制定編碼

常用方法

方法 說明 Close 關閉當前BinaryWriter Seek 設置當前流的位置 Write 將值寫入流

BinaryReader

BinaryReader使用特定編碼將數據讀作二進制值。

常用方法

方法 說明 Close 關閉當前流 PeekChar 返回下一個可用的字符,並且不提升字節或字符的位置 Read 從流中讀取字符,並提升流的位置 ReadBoolean 從當前流中讀取Boolean值,並提升位置 ReadByte 讀取下一個字節,提升位置 ReadBytes 讀取count個字節到字節數組,提升count個位置 ReadChar 讀取一個字符,並根據所使用的Encoding和從流中讀取的特定字符,提升位置 ReadChars 從當前流中讀取count個字符,以字符數組的形式返回數據,並根據所使用的Encoding來提升位置 ReadInt32 從當前流中讀取4字節有符號整數,並提升4字節位置 ReadString 從當前流中讀取一個字符串。

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