1. 程式人生 > >C#文件操作(IO流 摘抄)

C#文件操作(IO流 摘抄)

引用 file HA 參考 dto RM 附加 文件系統格式 失敗

11 文件操作概述

11.1 驅動器

在Windows操作系統中,存儲介質統稱為驅動器,硬盤由於可以劃分為多個區域,每一個區域稱為一個驅動器。.NET Framework提供DriveInfo類和 DriveType枚舉型,以方便在程序中直接使用驅動器。DriveInfo類的常用字段成員有DriveFormat(文件系統格式,如NTFS或FAT32)、DriveType(驅動器類型)、Name(驅動器名)、TotalSize(總空間)、TotalFreeSpace(獲得驅動器可用空間)。常用的方法成員有GetDrives(獲得可用驅動器列表)。

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();
技術分享圖片

11.2 目錄

為了方便檢索文件,需要在驅動器中先創建目錄,然後把文件保存到這個目錄中。在Windows操作系統中,目錄又稱文件夾。每個驅動器都有一個根目錄,使用”\”表示,如”C:\”表示C驅動器的根目錄。創建在根目錄中的目錄稱為一級子目錄。在一級子目錄中創建的目錄稱為二級子目錄,依此類推。文件系統的目錄結構是一種樹形結構。

.NET Framework提供了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("該目錄已經存在");
}
技術分享圖片

11.3 文件

.NET Framework提供了File類和FileInfo類,以方便在程序中直接操作文件。File和FileInfo類位於System.IO命名空間,都可以用來實現創建、復制、移動、打開文件等操作。File類和FileInfo類與Directory類和DirectoryInfo類的工作方式相似。File類是一個靜態類,可直接調用其方法成員。FileInfo類不是靜態類,需要先創建實例。

1. 文件類File

File類的常用方法如表11.1所示。

表11.1 File類的常用方法

常 用 方 法

介 紹

Open()

打開文件

Create()

創建文件

Copy()

復制文件

Delete()

刪除文件

Exists()

判斷文件是否存在

Move()

移動文件

Replace()

替換文件

AppendAllText()

新建文件並添加文本

ReadAllText()

打開並讀取文本內容

下面通過一個示例演示File類的用法。

(1) 創建一個名為FileCreate的控制臺應用程序項目

(2) 修改Program.cs文件中的Main方法的內容如下:

 //設置所要創建文件的絕對路徑
string path = @"d:\test.txt";
//以路徑為參數創建文件
File.Create(path);

代碼中變量path給出類文件的路徑,利用File類的Create方法創建類該文件。查看D盤根目錄,會有一個新的test.txt的文檔出現。

2. 文件信息類 FileInfo

文件信息類FileInfo與File類不同,它雖然也提供類創建、復制、刪除、移動和打開文件的方法,並且幫助創建FileStream對象,但是它提供的僅僅是實例方法。表11.2和表11.3分別展示類FileInfo類的常用字段和方法。

表 11.2 FileInfo類常用字段

常用字段

介紹

Name

提取文件名

Directory

所屬目錄

Exists

是否存在(繼承自父類FileSystemInfo)

Extension

文件擴展名

Length

文件長度

IsReadOnly

是否為只讀

表 11.3 FileInfo類常用方法

常用方法

介紹

Open()

打開文件

Create()

創建文件

CopyTo()

復制到新文件

Delete()

刪除文件

MoveTo()

移動文件

Replace()

替換文件

EnCrypt()

加密文件

Decrypt()

解密文件

因此要使用FileInfo類,必須先實例化一個FileInfo對象。FileInfo類的常用方法與File類基本相同。

與文件類File和文件夾類Directory相比,文件信息類FileInfo和文件夾信息類DirectoryInfo具有其大部分功能。

* File類和Directory類適合對不同的對象進行單一的處理。此種特殊情況下,靜態方法的調用速度比較快,不用進行實例化。

* FileInfo類和DirectoryInfo類適合用於對同一文件或文件夾進行多種操作的情況。此種情況下,實例化後的對象不需要每次都尋找文件,可以直接對該文件進行操作。

11.4 路徑

每個驅動器包含一個或多個目錄,而每個目錄又可以包含一個或多個子目錄,目錄的結構為樹形結構。一個文件只能保存在樹形結構的某個特定的目錄中,文件所在位置為路徑。要檢索文件時,必須首先確定文件的路徑。路徑由驅動器盤符、目錄名、文件名、文件擴展名和分隔符組成,有兩種種表示方法:一種是從驅動器的根目錄開始書寫,如C:\Windows\System32\notepad.exe,這種路徑稱為絕對路徑;另一種是從當前目錄位置開始書寫,如System32\notepad.exe(假設當前目錄為C:\Windows),這種路徑稱為相對路徑。

在C#中,使用文件和目錄路徑時要十分謹慎。C#將反斜杠”\”字符視作轉義符,因此當路徑表示為字符串時,要使用兩個反斜杠表示,例如:

“C:\\Windows\\System32\\notepad.exe”

另外,C#允許在字符串前添加”@”標誌,以提示編譯器不要把”\”字符視作轉義符,而視作普通字符,例如:

@”C:\Windows\System32\notepad.exe”

.NET Framework提供了Path類,以幫助在程序中管理文件和目錄路徑,Path類位於System.IO命名空間,是一個靜態類,可以用來操作路徑的每一個字段,如驅動器盤符、目錄名、文件名、文件擴展名和分隔符等。Path類的常用字段成員有PathSeperator(路徑分隔符,如”;”)、DirectorySeparatorChar(目錄分隔符,如”\”)、VolumeSeparator(卷分隔符,如”:”)、AltDirectorySeparator(替換目錄分隔符,如”/”),常用的方法成員有GetDirectoryName(取目錄名)、GetFileName(取文件名)、GetExtension(取文件擴展名)、GetFullPath(取完整路徑)、GetTempPath(取操作系統的臨時文件路徑)等,例如,以下代碼表示提取並顯示路徑中的目錄名和文件名。

string path = @"c:\windows\System32\notepad.exe";
Console.WriteLine(Path.GetDirectoryName(path));
Console.WriteLine(Path.GetFileName(path));

其中,目錄名為”C:\Windows\System32”,文件名為”notepad.exe”。

12 文件流概述

在.NET Framework中,文件和流是有區別的。文件是存儲在磁盤上的數據集,它具有名稱和相應的路徑。當打開一個文件並對其進行讀/寫時,該文件就稱為流(stream)。但是,流不僅僅是指打開的磁盤文件,還可以是網絡數據。.Net Framework允許在內存中創建流。此外,在控制臺應用程序中,鍵盤輸入和文本顯示都是流。流包括以下基本操作:

* 讀取(read):把數據從流傳輸到某種數據結構中,如輸出到字符數組中。

* 寫入(write):把數據從某種數據結構傳輸到流中,如把字節數組中的數據傳輸到流中。

* 定位(seek):在流中查找或重新定位當前位置。

12.1 操作流的類

1. Stream類

Stream類是所有流的抽象基類。Stream類的主要屬性有CanRead(是否支持讀取)、CanSeek(是否支持查找)、CanTimeout(是否可以超時)、CanWrite(是否支持寫入)、Length(流的長度)、Position(獲取或設置當前流中的位置)、ReadTimeout(獲取或設置讀取操作的超時時間)、WriteTimeout(獲取或設置寫操作的超時時間),主要方法有BeginRead(開始異步讀操作),BeginWrite(開始異步寫操作)、Close(關閉當前流)、EndRead(結束異步讀操作)、EndWrite(結束異步寫操作)、Flush(清除流的所有緩沖區並把緩沖數據寫入基礎設備)、Read(讀取字節序列)、ReadByte(讀取一個字節)、Seek(設置查找位置)、Write(寫入字節序列)、WriteByte(寫入一個字節)。

2. FileStream、MemoryStream和BufferedStream類

文件流類FileStream以流的形式讀、寫、打開、關閉文件。另外,它還可以用來操作諸如:管道、標準輸入/輸出等其他與文件相關的操作系統句柄。

內存流MemoryStream類用來在內存中創建流,以暫時保持數據,因此有了它就無須在硬盤上創建臨時文件。它將數據封裝為無符號的字節序列,可以直接進行讀、寫、查找操作。

緩沖流BufferedStream類表示把流先添加到緩沖區,再進行數據的讀/寫操作。緩沖區是存儲區中用來緩存數據的字節塊。使用緩沖區可以減少訪問數據時對操作系統的調用次數,增強系統的讀/寫功能。

註意,FileStream類也有緩沖功能,在創建FileStream類的實例時,只需要指定緩沖區的大小即可。

3. StreamReader和StreamWriter類

流讀取器StreamReader類用來以一種特定的編碼(如:UTF-8)從字節流中讀取字符,流寫入器StreamWriter類用來以一種特定的編碼(如:UTF-8)向流中寫入字符。StreamReader和StreamWriter類一般用來操作文本文件。

4. BinaryReader和BinaryWriter類

BinaryReader類用特定的編碼將基元數據類型讀作二進制。BinaryWriter類以二進制形式將基元類型寫入流,並支持用特定的編碼寫入字符串。

12.2 文件流類 FileStream

文件流類FileStream公開了以文件為主的Stream,既支持同步讀/寫操作,也支持異步讀/寫操作,FileStream類的特點是操作字節和字節數組。這種方式不適合操作用字符數據構成的文本文件,適合處理非文本文件。FileStream類提供了對文件的低級而復雜的操作,因此能夠實現更多高級的功能。

下面演示FileStreamWriter類的基本用法:

技術分享圖片
//要寫入文件的字符數組
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!");
技術分享圖片

代碼中首先給出了文件夾的路徑,利用Write方法向文件中寫入部分字符串。

下面演示FileStreamReader類的基本用法:

技術分享圖片
//要寫入文件的字符數組
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.Open);
 
    //設置流當前位置為文件開始位置
    m_FileStream.Seek(0, SeekOrigin.Begin);
    //將文件的內容存到字節數組中(緩存)
    m_FileStream.Read(m_bDataWrite, 0, 100);               
}
catch (Exception ex)
{
    Console.WriteLine("There is an IOException");
    Console.WriteLine(ex.Message);
}
 
//通過UTF-8編碼方法將字符數組轉換成字符數組
Decoder m_Dec = Encoding.UTF8.GetDecoder();
m_Dec.GetChars(m_bDataWrite, 0, m_bDataWrite.Length, m_cDataWrite, 0);
Console.WriteLine("Read from file Succeed!");
Console.WriteLine(m_cDataWrite);
技術分享圖片

代碼中首先給出了文件夾的路徑,利用Read方法從文件中讀取了部分字符串。

12.3 StreamWriter和StreamReader類

應用FileStream類需要許多額外的數據類型轉換操作,十分影響效率。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);
}
技術分享圖片

12.4 BinaryReader和BinaryWriter類(擴展)

BinaryWriter類是除了FileStream和StreamWriter類之外另一種向文件寫入數據的方式,與之前兩種方式不同,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();
技術分享圖片

代碼中首先給出了文件夾的路徑,利用BinaryWriter類的Write方法向文件中寫入部分二進制字符。該文件是以二進制存儲的,因此用記事本打開時,將無法觀察到正確的字符,必須使用支持二進制的文本閱讀器。

BinaryReader類是和BinaryWriter類相對應的二進制數據讀取類。它用特定的編碼將基元數據類型(如:字符串類型)讀作二進制值。

技術分享圖片
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();
技術分享圖片

代碼中首先給出了文件夾的路徑。利用BinaryReader類的ReadInt32方法從文件中讀取了所有的二進制字符,並將其讀為整數,便於輸出。

13 綜合應用(難點。重點)

13.1 創建日誌文件

日誌文件的作用是記錄程序運行事件。通常使用文本文件保存數據。日誌文件需要程序自動創建,並在指定的事件發生時,使用特定的格式把事件的相關數據記錄到日誌文件中。

1 技術要點

* 創建FileStream類實例時,能夠通過該類構造函數的參數,指定打開文件的方式和讀/寫訪問的方式。通過指定打開方式,實現日誌文件的自動創建。

* 使用StreamWriter類實例寫入文件時,因為部分數據可能由於系統緩慢而未能及時寫入,所以在所有的寫入操作完成後,需要調用Flush方法將緩沖區的文件內容更新到日誌文件中。

* 使用StreamWriter類實例寫入文件時,寫入的方式與Console類似,可以使用WriteLine向文件中寫入一行文本數據。

2 實現代碼

技術分享圖片
const string _FILENAME = @"..\..\logfile.txt";
static void Main()
{
    //從指定的目錄以打開或者創建的形式讀取日誌文件
    using (FileStream fs = new FileStream(_FILENAME, FileMode.OpenOrCreate, FileAccess.Write))
    {
        //創建日誌文件的寫入流
        StreamWriter sw = new StreamWriter(fs);
        //向日誌文件寫入日誌信息
        Log("日誌文件創建成功", sw);
        //關閉日誌文件寫入流
        sw.Close();
        Console.WriteLine("日誌文件已創建");
    }
 
    //讀取並顯示日誌文件
    using (StreamReader sr = new StreamReader(_FILENAME, Encoding.UTF8))
    {
        string strContent = sr.ReadToEnd();
        sr.Close();
        Console.WriteLine(strContent);
    }
 
    Console.ReadLine();
}
 
static void Log(String message, TextWriter tw)
{
    tw.Write("Log Entry:");
    tw.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
    tw.WriteLine(" :");
    tw.WriteLine(" :{0}", message);
            tw.WriteLine("----------------------------------");
            //將緩沖區中的內容更新到日誌文件中
   tw.Flush();
}
技術分享圖片

3 源程序解讀

(1)程序引用了System.IO命名空間,在程序頭部應添加對該命名空間的引用。

(2)程序中定義了表示文件路徑的常量_FILENAME

(3)在創建FileStream類實例時,使用FileMode.OpenOrCreate模式,即文件不存在時就創建,存在時就打開已存在的文件。

13.2 對日誌文件的讀/寫操作

日誌文件的讀/寫和文本文件的讀/寫方法基本相同,日誌文件除了使用StreamReader類和StreamWriter類的實例進行讀/寫外,還有一些記錄事件的要求。例如,在寫入數據時使用追加的方式、控制日誌文件的大小等。

1 技術要點

* 使用FileInfo類實例獲取日誌文件的大小,實現當日誌文件的大小超出指定範圍時清空日誌數據的功能。並使用該類實例的OpenWrite方法,創建FileStream類實例進行寫入文件的操作,實現日誌文件的自動創建功能。

* 使用StreamWriter類中定義的Seek方法,將寫入位置移動到文件末尾,實現將數據以追加方式寫入日誌文件的功能。

* 使用StreamReader類中定義的Peek方法,判斷讀取器是否已經讀到日誌文件的末尾。

2 實現代碼

技術分享圖片
//表示日誌文件路徑及文件名稱的字符串
const string FILENAME = @"..\..\logfile.txt";
static void Main(string[] args)
{
    //寫入日誌信息
    WriteLogFile(FILENAME, "日誌信息一");
    //讀取日誌文件
    Console.WriteLine(ReadLogFile(FILENAME));
    Console.ReadLine();
}
 
static string ReadLogFile(string FileNameWithPath)
{
    //從指定的目錄以打開或創建的形式讀取日誌文件
    FileStream fs = new FileStream(FileNameWithPath, FileMode.OpenOrCreate, FileAccess.Read);
    //定義輸出字符串
    StringBuilder output = new StringBuilder();
    //初始化該字符串的長度為0
    output.Length = 0;
    //為上面創建的文件流創建讀取數據流
    StreamReader read = new StreamReader(fs);
    //設置當前流的起始位置為文件流的起始點
    read.BaseStream.Seek(0, SeekOrigin.Begin);
    //讀取文件
    while(read.Peek() > -1)
    {
        //取文件的一行內容並換行
        output.Append(read.ReadLine() + "\n");
    }
    //關閉釋放讀數據流
    read.Close();
    //返回讀到的日誌文件內容
    return output.ToString();
}
 
static void WriteLogFile(string FileNameWithPath, string Message)
{
    //定義文件信息對象
    FileInfo finfo = new FileInfo(FileNameWithPath);
    //判斷文件是否存在以及是否大於2K
    if(finfo.Exists && finfo.Length > 2048)
    {
        //刪除該文件
        finfo.Delete();
    }
    //創建只寫文件流
    using(FileStream fs = finfo.OpenWrite())
    {
        //根據上面創建的文件流創建寫數據流
        StreamWriter w = new StreamWriter(fs);
        //設置寫數據流的起始位置為文件流的末尾
        w.BaseStream.Seek(0, SeekOrigin.End);
        //寫入"Log Entry:"
        w.Write("Log Entry:");
        //寫入系統的當前時間並換行
        w.Write("{0} {1} \r\n", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
        //寫入日誌內容並換行
        w.Write(Message + "\r\n");
        //寫入-------------------------並換行
        w.Write("----------------------\r\n");
        //清空緩沖區內容,並把緩沖區內容寫入基礎流
        w.Flush();
        w.Close();
    }
技術分享圖片

運行結果如下:

Log Entry:14:26:09 2017年5月1日

日誌信息一

-------------------------------

3 源程序解讀

(1)本示例程序使用寫日誌文件的WriteLogFile方法向文件中寫入一條信息數據,再通過讀取日誌文件的ReadLogFile方法將日誌文件的數據顯示出來。本示例程序的流程圖如下所示: 技術分享圖片 圖1 對日誌文件讀/寫操作示例程序流程圖

(2)在寫入日誌文件的WriteLogFile方法中,首先打開並判斷日誌文件的大小是否超出了指定的尺寸。如果超出了指定的尺寸,就先將日誌文件刪除。然後通過FileInfo類實例的OpenWrite方法創建只寫文件流,向該流中寫入日誌數據。

(3)在讀取日誌文件的ReadLogFile方法中,首先創建一個StringBuilder類的實例,用來獲取日誌文件中的文本數據。接著使用StreamReader類定義的BaseStream屬性中的Seek方法,將讀取器位置定位在流的開始位置,然後循環讀取日誌文件中的文本數據,並追加到StringBuilder類實例中,讀取過程中,通過StreamReader類中定義的Peek方法判斷是否讀到文件末尾。

11.3 復制文件

靜態File類中提供了許多操作文件的方法,使用Copy方法復制文件是比較常見的一種操作,調用Copy方法時,可以使用overwrite參數指定是否覆蓋文件。

1 技術要點

* 使用靜態類File的Exists方法判斷文件是否存在。

* 使用靜態類File的Copy方法實現復制文件的功能,當文件存在時,通過指定override參數覆蓋原有文件。

* 復制文件是系統操作,為了保證程序的穩定性,在復制文件的過程中需要捕獲並處理異常。

2 實現代碼

技術分享圖片
//源文件路徑及文件名
const string SOURCEFILENAME = @"..\..\myfile.txt";
//目標文件路徑及文件名
const string DESTINATIONFILENAME = @"..\..\result.txt";
static void Main(string[] args)
{
    try
    {
        //判斷源文件是否存在
        if(!File.Exists(SOURCEFILENAME))
        {
            Console.WriteLine("找不到源文件");
        }
        else if (File.Exists(DESTINATIONFILENAME))
        {
            Console.Write("目標文件已經存在,是否覆蓋?(Y/N)");
            if(Console.ReadKey(false).Key == ConsoleKey.Y)
            {
                //覆蓋文件
                File.Copy(SOURCEFILENAME, DESTINATIONFILENAME, true);
                Console.WriteLine("復制文件完成");
            }
            else
            {
                Console.WriteLine("取消復制文件");
            }
        }
        else
        {
            //直接復制
            File.Copy(SOURCEFILENAME, DESTINATIONFILENAME);
            Console.WriteLine("復制文件完成");
        }
    }
    catch (Exception)
    {
        Console.WriteLine("復制文件失敗");
    }
    Console.ReadLine();
}
技術分享圖片

3 源程序解讀

(1)本示例使用File靜態類的方法實現文件的復制操作。首先判斷源文件是否存在,如果源文件不存在,不作任何處理就返回。接著判斷目標文件是否存在,如果目標文件不存在,就直接復制文件,否則就詢問是否覆蓋現有的目標文件,當用戶選擇覆蓋時,使用源文件覆蓋目標文件。

(2)在復制文件的方法調用時,將復制文件的代碼放在一個try...catch結構中,以便捕獲並處理復制文件時出現的異常。

(3)程序執行後,將程序文件所在目錄下生成一個名為”result.txt”的文本文件。內容與”myfile.txt”文件一致。

14 小結

本章主要介紹了.NET中的文件相關的操作。重點介紹了System.IO命名空間下的File類、Directory類、FileInfo類、DirectoryInfo類及FileStream類、StreamReader類、StreamWriter類、BinaryReader類、BinaryWriter類等。並給出了相應的代碼示例。

附加:

根據文件路徑得到內存流的方法

技術分享圖片
        static MemoryStream GetFileStream(string fileName)
        {
            FileStream sr = File.OpenRead(fileName);
            int byteLen = (int)sr.Length;
            byte[] fileBytes = new byte[byteLen];
            int bytesRead = sr.Read(fileBytes, 0, byteLen);
            MemoryStream stream = new MemoryStream(fileBytes);
            sr.Dispose();
            return stream;
        }
技術分享圖片

摘抄自:參考資料:《c# 編程兵書》 張誌強 胡君 編著

C#文件操作(IO流 摘抄)