.Net Core 文件提供程序
文件提供程序的三个核心接口
.Net Core 文件提供程序有三个主要的核心接口:
- IFileProvider
- IFileInfo
- IDirectoryContents
IFileProvider
IFileProvider 接口是只读文件提供程序的抽象。
它定义了三个方法:
- GetDirectoryContents(String) :枚举位于给定路径的目录(如果有)。
- GetFileInfo(String) :在给定的路径查找某个文件。
- Watch(String) :为指定的 filter 创建 IChangeToken。监听某个文件,当文件被修改时,会触发相应的操作。
IFileInfo
IFileInfo 接口定义了一些描述文件的属性:
- Exists :文件如果存在,则为 True。
- IsDirectory :是否为目录。
- LastModified :获取上次修改文件的时间。
- Length :文件的长度(以字节为单位);对于目录或非现有文件,则返回 -1。
- Name :文件或目录的名称,不包括任何路径。
- PhysicalPath :文件的路径,包括文件名。 如果不可直接访问该文件,则返回 null。
定义了一个方法:
- CreateReadStream() :返回只读流形式的文件内容。 调用方在完成后应释放流。
IDirectoryContents
IDirectoryContents 接口定义了文件提供程序中的目录内容。它继承了 IEnumerable<IFileInfo> 和 IEnumerable ,具有以下属性:
-Exists :如果目录存在,则为 True。
内置文件提供程序
.Net Core 内置的比较实用的文件提供程序有三个:
- PhysicalFileProvider
- EmbeddedFileProvider
- CompositeFileProvider
PhysicalFileProvider
PhysicalFileProvider 类,使用磁盘上的文件系统查找文件:
IFileProvider provider1 = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory);
var contents = provider1.GetDirectoryContents("/");
foreach (var item in contents)
{
Console.WriteLine(item.Name);
}
EmbeddedFileProvider
EmbeddedFileProvider 类,查找嵌入资源文件,区分大小写。
IFileProvider provider2 = new EmbeddedFileProvider(typeof(Program).Assembly);
var txt = provider2.GetFileInfo("test.txt");
CompositeFileProvider
EmbeddedFileProvider 类,组合文件提供程序,可以组合多个 IFileProvider :
IFileProvider provider1 = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory);
IFileProvider provider2 = new EmbeddedFileProvider(typeof(Program).Assembly);
IFileProvider provider = new CompositeFileProvider(provider1, provider2);
var contents = provider.GetDirectoryContents("/");
在获取文件信息时,会遍历所以 IFileProvider ,若找到文件,则中断遍历,若找不到文件,则返回 NotFoundFileInfo 对象。
总结
PhysicalFileProvider 类,实现了 IFileProvider 、IDisposable 接口,其 GetFileInfo 方法返回的 PhysicalFileInfo 对象实现了 IFileInfo 接口 ;
EmbeddedFileProvider 类,实现了 IFileProvider 接口,其 GetFileInfo 方法返回的 EmbeddedResourceFileInfo 对象实现了 IFileInfo 接口 ;
在了解文件提供程序的实现原理后,我们可以自定义文件提供程序,比如获取OSS文件等。