1. 程式人生 > >跟我一起學.NetCore之檔案系統應用及核心淺析

跟我一起學.NetCore之檔案系統應用及核心淺析

**前言** 在開發過程中,肯定避免不了讀取檔案操作,比如讀取配置檔案、上傳和下載檔案、Web中html、js、css、圖片等靜態資源的訪問;在配置檔案讀取章節中有說到,針對不同配置源資料讀取由對應的IConfigurationProvider進行讀取,其實讀取檔案也是一樣,針對於不同型別(物理檔案、嵌入檔案、雲端檔案等)檔案,就由對應的IFileProvider的實現進行讀取,下面詳細說說; **正文** 由於通過IFileProvider將目錄檔案進行抽象化,統一規範讀取操作,使得讀取不同地方的檔案就顯得更加方便,如物理檔案、嵌入檔案,只要有對應的實現即可;而框架針對物理檔案和嵌入檔案已經進行了具體實現,如下: - PhysicalFileProvider:物理檔案提供程式,用來讀取物理檔案,就是平時使用的檔案,不管是副檔名是什麼; - EmbeddedFileProvider:嵌入檔案提供程式,用來讀取嵌入檔案,就是程式編譯時嵌入到程式集內部的檔案,就像資原始檔一樣; - CompositeFileProvider:組合提供程式,同時可以讀取物理檔案和嵌入檔案,就是可以指定多種資料來源,這樣的好處就是像操作同一個資料來源一樣;後續也可以與自定義的提供程式進行組合; 為了避免直接扒程式碼懵圈,先來個控制檯例子,體驗一下以上xxxProvider的使用: ![img](https://i.loli.net/2020/09/14/agw1vJuNpXD9dIL.png) 執行結果: ![img](https://i.loli.net/2020/09/14/SnRwlPjtKvo8u5k.png) 讀取物理檔案是不是很簡單,其實就是建立了一個PhysicalFileProvider物件時指定了一個路徑,然後就能很方便的獲取到對應目錄下的資訊; **嵌入檔案**也是如此,只需指定對應程式集即可(因為嵌入檔案已經編譯到程式集中),如下優化程式碼: ![img](https://i.loli.net/2020/09/14/MxlZAQguk8FidHf.png) 執行結果如下: ![img](https://i.loli.net/2020/09/14/7W6th4upYJ8Q2EA.png) 同樣也是使用很簡單,只是在建立EmbeddedFileProvider物件時指定一下對應的程式集即可,後續便可以用統一的方式進行檔案和目錄操作; 組合提供程式的目的就是將不同提供程式整合,就像使用同一個源一樣,如下: ![img](https://i.loli.net/2020/09/14/ScOajGu3Vq9ZUik.png) 當然,按老套路走,不能用用就行了,繼續扒扒程式碼,先看看IFileProvider: ```c# namespace Microsoft.Extensions.FileProviders { // IFileProvider定義的三個方法其實就是其對應的三大功能 public interface IFileProvider { // 獲取指定檔案的資訊,之後可以檔案進行讀取操作 IFileInfo GetFileInfo(string subpath); // 獲取指定目錄下所有內容 IDirectoryContents GetDirectoryContents(string subpath); // 用於監聽檔案改變 IChangeToken Watch(string filter); } } ``` 再來看看返回的IFileInfo和IDirectoryContents : ```c# namespace Microsoft.Extensions.FileProviders { public interface IFileInfo { // 標識是否存在 bool Exists { get; } // 檔案大小,如果不存在或是目錄,這個值就是-1 long Length { get; } // 對應的物理路徑,其實就是檔案的實際路徑 string PhysicalPath { get; } // 檔名字 string Name { get; } // 檔案最後的修改時間 DateTimeOffset LastModified { get; } // 標識是否是目錄 bool IsDirectory { get; } // 返回的留可以進行檔案讀取 Stream CreateReadStream(); } // 其他資訊繼承了IFileInfo資訊 public interface IDirectoryContents : IEn