跟我一起學.NetCore之檔案系統應用及核心淺析
阿新 • • 發佈:2020-09-14
**前言**
在開發過程中,肯定避免不了讀取檔案操作,比如讀取配置檔案、上傳和下載檔案、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