1. 程式人生 > 實用技巧 >IO非同步,讀寫壓縮檔案,監控檔案系統

IO非同步,讀寫壓縮檔案,監控檔案系統

這節結尾IO,講一下非同步操作檔案,讀寫壓縮檔案,監控檔案系統這三個知識點。

非同步操作檔案:

說到非同步,必然要了解的是async和await這兩個關鍵字(非同步詳情點選基於任務的非同步程式設計(Task,async,await)這篇文章進行了解),此段講解對於初學者可以簡單涉獵,接下來進入正題,在操作大檔案的時候,必然要消耗大量的時間,同步情況下,必然會阻塞程式執行,所以.NET 4.5以後,對FileStream和StreamReader/Writer的讀寫檔案方法加入了非同步版本,從而在操作大檔案時解放對主執行緒的阻塞,我們可以通過Async字尾來區分哪是非同步的,如FileStream的ReadAsync()是Read()的非同步版本。

使用非同步,需要將非同步的邏輯封裝到一個方法中,下面演示程式碼,程式碼邏輯跟FileStream的演示程式碼一樣:

private async static Task<string> ReadFile(FileStream fs)
{
    int len, i = 0;
    byte[] buffer = new byte[5];
    byte[] data = new byte[fs.Length];
    while ((len =await fs.ReadAsync(buffer, 0, buffer.Length)) != 0)
    {
        for
(int j = 0; j < len; j++) { data[i++] = buffer[j]; } } return Encoding.UTF8.GetString(data); }

接下來在主方法中呼叫:

FileStream fs = new FileStream("./demo.txt", FileMode.Open, FileAccess.Read);
Task<string> file = ReadFile(fs);
file.ContinueWith(t =>
{
    Console.WriteLine(t.Result);
});

執行結果就是整個檔案的所有文字。其它的非同步方法我就不一一演示了。

讀寫壓縮檔案:

我們都用過壓縮軟體壓縮檔案,壓縮檔案的原理大體上可以理解為通過演算法把重複的資料清除,解壓縮就是通過演算法把清除的重複資料復原。.NET給我們提供了兩個用於壓縮的類:GZipStream和DeflateStream,它們存在於System.IO.Compression這個名稱空間下,這兩個類用法都差不多,而且都是公開免費的,下面簡單通過程式碼介紹一下如何壓縮一個檔案,至於更高階的一次壓縮多個檔案,讀者可以自行查閱相關文件。

//目標檔案
StreamReader sr=new StreamReader("./demo.txt");
//壓縮後文件
FileStream fw=new FileStream("./demo_zip.txt.zip",FileMode.OpenOrCreate,FileAccess.Write);

//基於FileStream建立壓縮物件
GZipStream gs=new GZipStream(fw,CompressionMode.Compress);
//寫入壓縮後的資料
StreamWriter sw=new StreamWriter(gs);
string data=string.Empty;
while ((data=sr.ReadLine())!=null)
{
    sw.Write(data);
}
//必須關閉寫入物件,否則會導致壓縮檔案失敗
sw.Close();

執行完成後,可以看一下兩個檔案的大小:

在建立壓縮物件的時候,第二個引數是CompressionMode列舉,它有兩個成員:Compress和Decompress,指定是壓縮還是解壓縮,解壓縮的方式跟壓縮一樣,此處不再贅述。

監控檔案系統:

.NET 提供了一個FilSystemWatcher類用於監控檔案系統,何為監控檔案系統呢,就是監控檔案或者目錄的操作,當用戶進行某項操作時,監控物件會呼叫對應的方法,這跟事件及其響應機制是一樣的模式。

本節對此不做程式碼演示,主要講解一下FileSystemWatcher類的一些屬性:

Path:設定要監控的檔案位置或者目錄

NotifyFilter:列舉,指示要監控的內容,可以通過OR運算子進行列舉合併

Filter:指定要監控哪些檔案:如*.txt

FilSystemWatcher類有四個事件:Changed,Created,Deleted,Renamed,我們需要為這四個事件新增事件處理程式,當監控到特定行為時,就會觸發相應的事件。

這是我的公眾號二維碼,獲取最新文章,請關注此號