C#文件的讀寫


  在System.IO命名空間中提供了多個類,用於進行數據文件和數據流的讀寫操作。

1 文件和流

  文件(file)和流(stream)既有區別又有聯系。文件是在各種媒質上(可移動磁盤、硬盤、光盤等)永久存儲的數據的有序集合。它是一種進行數據讀寫操作的基本對象。通常情況下,文件按照樹狀目錄進行組織,每個文件都有文件名、文件所在路徑、創建時間、訪問權限等屬性。

  流是字節序列的抽象概念,例如文件、輸入輸出設備、內部進程通信管道或者TCP/IP 套接字等均可以看成流。簡言之,流是一種向后備存儲器寫入字節和從后備存儲器讀取字節的方式。

  流也是進行數據讀取操作的基本對象,流為我們提供了連續的字節流存儲空間。雖然數據實際存儲的位置可以不連續,甚至可以分布在多個磁盤上,但我們看到的是封裝以后的數據結構,是連續的字節流抽象結構,這和一個文件也可以分布在磁盤上的多個扇區一樣。‘

  除了和磁盤文件直接相關的文件流以外,還有多種其它類型的流,例如分布在網絡中、內存中和磁帶中的流,分別稱為網絡流、內存流和磁帶流。

  所有表示流的類都是從抽象基類Stream 繼承的。

  流有如下幾種操作:

  ◆ 讀取:從流中讀取數據到變量中。
  ◆ 寫入:把變量中的數據寫入到流中。
  ◆ 定位:重新設置流的當前位置,以便隨機讀寫。

  File 類的靜態方法主要是用於創建FileStream 類。一個FileStream 類的實例實際上代表一個磁盤文件,使用FileStream 類可以對文件系統上的文件進行讀取、寫入、打開和關閉操作,也可以對其他與文件相關的操作系統句柄進行操作,如管道、標准輸入和標准輸出。由於FileStream 能夠對輸入輸出進行緩沖,因此可以提高系統的性能。

2 文件的打開

  打開指定路徑上的FileStream,可以使用File 類的Open 方法或OpenRead 方法或OpenText方法。利用Open 方法打開文件的方式有三種,如表所示。

表  Open方法的重載形式

名稱 說明
File.Open (String, FileMode) 打開指定路徑上的 FileStream,具有讀/寫訪問權限
File.Open (String, FileMode, FileAccess) 以指定的模式和訪問權限打開指定路徑上的 FileStream
File.Open (String, FileMode, FileAccess, FileShare)

打開指定路徑上的FileStream,具有指定的讀、寫或讀/寫訪問模式以及指定的共享選項

   FileMode 值用於指定在文件不存在時是否創建該文件,並確定是保留還是改寫現有文件的內容;FileAccess 值指定可以對文件執行的操作;FileShare 值指定其他線程所具有的對該文件的訪問類型。

3 文本文件的讀寫

  利用Open 方法打開文件后,可以用StreamReader 類來讀取文件的內容,用StreamWriter類向文件寫入內容,它們提供了按文本模式讀寫數據的方法。下面示例中用到的OpenText 方法是File 類的一個靜態方法,不能被某個具體的File 類的實例調用,它表示從一個已經存在的文本文件中讀取一個文本流,並保存在一個StreamReader 實例中。

  【例】從一個文本文件中讀取內容並顯示在屏幕上。

using System;
using System.IO;
class FileTest
{
    public static void Main()
    {
        StreamReader sr;
        try
        {
            sr = File.OpenText("c:\\c#\\file1\\file1.txt");
        }
        catch
        {
            Console.WriteLine("文件打開失敗");
            return;
        }
        while (sr.Peek() != -1)
        {
            String str = sr.ReadLine();
            Console.WriteLine(str);
        }
        Console.WriteLine("到達文件結尾");
        sr.Close();
    }
}

  【例】向文本文件中寫入文本流

using System;
using System.IO;
class FileTest
{
    public static void Main()
    {
        StreamWriter sw;
        try
        {
            sw = File.CreateText("c:\\c#\\file1\\file2.txt");
        }
        catch
        {
            Console.WriteLine("文件創建失敗");
            return;
        }
        sw.WriteLine("網址:");
        sw.WriteLine("www.sohu.com");
        sw.WriteLine("www.263.net");
        sw.WriteLine("www.microsoft.com/china");
        sw.WriteLine("www.sina.com.cn");
        sw.Close();
    }
}

4 二進制文件的讀寫

  System.IO 還為我們提供了BinaryReader 和BinaryWriter 類,用於按二進制模式讀寫文件。它們提供的一些讀寫方法是對稱的,比如針對不同的數據結構,BinaryReader 提供了ReadByte、ReadBoolean、ReadInt、ReadInt16、ReadDouble、ReadString 等方法,而BinaryWriter 則提供了WriteByte、WriteBoolean、WriteInt、WriteInt16、WriteDoubleWriteString 方法。

  【例】將內存中隨機產生的二進制數據寫入文件,並驗證寫入結果是否正確。

using System;
using System.IO;
class BinaryRW
{
    static void Main()
    {
        int i = 0;
        //創建隨機數據寫入流
        byte[] writeArray = new byte[1000];
        new Random().NextBytes(writeArray);
        BinaryWriter binWriter = new BinaryWriter(new MemoryStream());
        BinaryReader binReader = new BinaryReader(binWriter.BaseStream);
        try
        {
            //將數據寫入流
            Console.WriteLine("正在寫數據…");
            for (i = 0; i < writeArray.Length; i++)
            {
                binWriter.Write(writeArray[i]);
            }
            //流定位到開始位置
            binReader.BaseStream.Position = 0;
            //讀取流中的數據
            for (i = 0; i < writeArray.Length; i++)
            {
                if (binReader.ReadByte() != writeArray[i])
                {
                    Console.WriteLine("寫數據錯");
                    return;
                }
            }
            Console.WriteLine("數據已寫入");
        }
        //捕獲EndOfStreamException 異常,輸出錯誤信息
        catch (EndOfStreamException e)
        {
            Console.WriteLine("寫數據出錯\n{0}", e.GetType().Name);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM