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,我們需要為這四個事件新增事件處理程式,當監控到特定行為時,就會觸發相應的事件。
這是我的公眾號二維碼,獲取最新文章,請關注此號