.NET Core C# 中級篇2-7 文件操作

来源:https://www.cnblogs.com/WarrenRyan/archive/2019/08/28/11421592.html
-Advertisement-
Play Games

.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,在博客園中點一個關註和推薦。

Github

BiliBili主頁

WarrenRyan'sBlog

博客園


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 工具類,是一個單獨的工程項目 提取必要信息至ftp.properties配置文件中 封裝FtpUtils工具類 導入jar包版本: 測試調用: 註:使用的是springboot,已經集成了ftp,所以沒有配置相應的xml文件。 ...
  • hashlib模塊 用於加密相關的操作,3.x里代替了md5模塊和sha模塊 加密功能 運行結果(將hello轉換成一個密文): ...
  • SQLite是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統。 不像常見的客戶-伺服器範例,SQLite引擎不是個程式與之通信的獨立進程,而是連接到程式中成為它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。 Python標準庫包含一個SQLite包裝器:使用模塊sql... ...
  • 最近培訓新人,最後練習使用Struts2框架練習,但是聯繫中碰到了畫面List對象傳後臺無法傳遞的問題。網上看了一圈沒有找到對應的解決辦法。最後自己找到了一種,寫下來後面可以再看。 註:方法千千萬,有其他能解決的,或者我寫的有不對的地方歡迎指正! 上圖表格裡面的就是我想上傳到後臺的內容,因為下麵的更 ...
  • 電腦與程式設計 1.根據一系列指令對數據進行處理的工具或機器 (編程語言) 2.特征: 2.1可以進行數據計算 2.2 根據指令執行任務 3.組成 3.1運算器+控制器(CPU) 3.2存儲器(記憶體及硬碟)——>記憶體:臨時;硬碟:永久 3.3輸入設備和輸出設備 4.工作過程(IPO) 4.1輸入( ...
  • ACM-Jesus Is Here[遞推]2015沈陽online ...
  • 一、分治策略 “分而治之”,大問題能夠拆成相似的小問題,記住這些小問題需要具有相似性。而後將小問題的每個解合成為大問題的解。所以說大問題如何拆,小問題如何合併才是這個演算法最主要的一個思想。實際上很多演算法如貪心演算法,動態規劃等等都是要求把大問題拆成小問題。而分治演算法的重要一點就是要適用於能夠重新把小問 ...
  • 課時一、python運行方式 1、windows命令提示符打開python的方法:首先windows+r輸入cmd打開命令提示符,在cmd輸入python或者py 2、腳本方式:步驟1:編寫腳本代碼,保存為 *.py 步驟2:命令提示符 python *.py 課時二、Python變數、數據類型及存 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...