.NET Core CSharp 中級篇2 7 本節內容為文件操作 簡介 文件操作在我們C 里還是比較常見的,例如我們讀取Excel、Txt文件的內容,在程式中,這些文件都是以流的方式讀取進入我們記憶體中,本節內容會詳細的講解有關文件的操作的方法。 我們從最大的驅動器開始往文件這個最小的開始講解 驅動 ...
.NET Core CSharp 中級篇2-7
本節內容為文件操作
簡介
文件操作在我們C#里還是比較常見的,例如我們讀取Excel、Txt文件的內容,在程式中,這些文件都是以流的方式讀取進入我們記憶體中,本節內容會詳細的講解有關文件的操作的方法。
我們從最大的驅動器開始往文件這個最小的開始講解
驅動器讀取
在Windows操作系統中,存儲介質統稱為驅動器,硬碟由於可以劃分為多個區域,每一個區域稱為一個驅動器。.NET提供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();
目錄
為了方便檢索文件,需要在驅動器中先創建目錄,然後把文件保存到這個目錄中。在Windows操作系統中,目錄又稱文件夾。每個驅動器都有一個根目錄,使用””表示,如”C:”表示C驅動器的根目錄。創建在根目錄中的目錄稱為一級子目錄。在一級子目錄中創建的目錄稱為二級子目錄,依此類推。文件系統的目錄結構是一種樹形結構。
.NET提供了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("該目錄已經存在");
}
文件
文件的操作主要是分為兩個類,一個是File類,一個是FileInfo類。File和FileInfo類位於System.IO命名空間,都可以用來實現創建、複製、移動、打開文件等操作。File類和FileInfo類與Directory類和DirectoryInfo類的工作方式相似。File類是一個靜態類,可直接調用其方法成員。FileInfo類不是靜態類,需要先創建實例。
File類
File類是一個文件的基本操作類,提供用於創建、複製、刪除、移動和打開文件的靜態方法,並協助創建 FileStream 對象。裡面包含的大多都是實際操作文件的方法,我用一個列表表示它內部常用的方法
- Open(string path, FileMode mode)+3重載 打開指定路徑文件
- Create(string path)+3重載,在指定路徑創建文件,可以指定緩衝區大小
- Copy(string sourceFileName, string destFileName),複製文件
- Delete(string path),刪除文件
- Exists(),判斷文件是否存在
- Move(string sourceFileName, string destFileName),移動文件
- Replace(string sourceFileName,string destinationFileName,
string destinationBackupFileName),替換文件 - AppendAllText(string path, string contents)新建文件並添加文本
- ReadAllText(string path, Encoding encoding)+2重載,打開並讀取文本內容(可以指定打開的編碼格式)
這些方法的使用也是非常簡單,例如:
string path = @"E:\test.txt";
//以路徑為參數創建文件
File.Create(path);
更多的使用你最好自己去嘗試,我們這幾節的內容都是一些常用的類和方法的實際運用,並沒有過多的知識點,你只需要按著這裡的操作一直嘗試即可。
FileInfo類
FileInfo類也可以對文件進行操作,文件信息類FileInfo與File類不同,它雖然也提供類創建、複製、刪除、移動和打開文件的方法,並且幫助創建FileStream對象,但是它提供的僅僅是實例方法他是我們最常用的文件操作類。
它裡面含有的屬性有:
- Name 提取文件名
- Directory 所屬目錄
- Exists 是否存在(繼承自父類FileSystemInfo)
- Extension 文件擴展名
- Length 文件長度
- IsReadOnly 是否為只讀
常用的方法和File類類似,這裡添加幾個之前沒有講過的
- EnCrypt() 加密文件
- Decrypt() 解密文件
- CopyTo() 複製到新文件
- MoveTo() 移動文件
與文件類File和文件夾類Directory相比,文件信息類FileInfo和文件夾信息類DirectoryInfo具有其大部分功能。
- File類和Directory類適合對不同的對象進行單一的處理。此種特殊情況下,靜態方法的調用速度比較快,不用進行實例化。
- FileInfo類和DirectoryInfo類適合用於對同一文件或文件夾進行多種操作的情況。此種情況下,實例化後的對象不需要每次都尋找文件,可以直接對該文件進行操作。
文件流
文件流對我們而言是一個陌生的概念,事實上,你仔細思考一下,我們是如何通過File類和FileInfo類讀取文件中的內容呢?它其實就是以文件流的形式進行讀寫。流包括以下基本操作:
- 讀取(read):把數據從流傳輸到某種數據結構中,如輸出到字元數組中。
- 寫入(write):把數據從某種數據結構傳輸到流中,如把位元組數組中的數據傳輸到流中。
- 定位(seek):在流中查找或重新定位當前位置。
在C#中,所有的流操作都繼承於Stream類,Stream類的主要屬性有
- CanRead(是否支持讀取)
- CanSeek(是否支持查找)
- CanTimeout(是否可以超時)
- CanWrite(是否支持寫入)
- Length(流的長度)
- Position(獲取或設置當前流中的位置)
- ReadTimeout(獲取或設置讀取操作的超時時間)
- WriteTimeout(獲取或設置寫操作的超時時間)
主要方法有
- BeginRead(開始非同步讀操作)
- BeginWrite(開始非同步寫操作)
- Close(關閉當前流)
- EndRead(結束非同步讀操作)
- EndWrite(結束非同步寫操作)
- Flush(清除流的所有緩衝區並把緩衝數據寫入基礎設備)
- Read(讀取位元組序列)
- ReadByte(讀取一個位元組)
- Seek(設置查找位置)
- Write(寫入位元組序列)
- WriteByte(寫入一個位元組)。
FileStream、MemoryStream和BufferedStream類
文件流類FileStream以流的形式讀、寫、打開、關閉文件。另外,它還可以用來操作諸如:管道、標準輸入/輸出等其他與文件相關的操作系統句柄。
記憶體流MemoryStream類用來在記憶體中創建流,以暫時保持數據,因此有了它就無須在硬碟上創建臨時文件。它將數據封裝為無符號的位元組序列,可以直接進行讀、寫、查找操作。
緩衝流BufferedStream類表示把流先添加到緩衝區,再進行數據的讀/寫操作。緩衝區是存儲區中用來緩存數據的位元組塊。使用緩衝區可以減少訪問數據時對操作系統的調用次數,增強系統的讀/寫功能。
註意,FileStream類也有緩衝功能,在創建FileStream類的實例時,只需要指定緩衝區的大小即可。
示例
//要寫入文件的字元數組
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!");
StreamReader和StreamWriter類
流讀取器StreamReader類用來以一種特定的編碼(如:UTF-8)從位元組流中讀取字元,流寫入器StreamWriter類用來以一種特定的編碼(如:UTF-8)向流中寫入字元。StreamReader和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);
}
BinaryReader和BinaryWriter類
BinaryReader類用特定的編碼將基元數據類型讀作二進位。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();
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();
Reference
《c# 編程兵書》第11章 張志強 胡君 編著
如果我的文章幫助了您,請您在github.NETCoreGuide項目幫我點一個star,在博客園中點一個關註和推薦。