24 | 文件提供程序:让你可以将文件放在任何地方

文件提供程序核心类型:

1、IFileProvider

2、IFileInfo

3、IDirectoryContents

IFileProvider 是访问各种各样文件提供程序的接口

通过这样子抽象的定义,让我们与具体的抽象文件的读取的代码进行了隔离

这样的好处是我们可以从不同的地方去读取文件,不仅仅是我们的物理文件,也可以是嵌入式文件,甚至可以说是云端上面的其他 API 提供的文件

内置的提供程序有三种:

(1)PhysicalFileProvider:物理文件的提供程序

(2)EmbeddedFileProvider:嵌入式的提供程序

(3)CompositeFileProvider:组合文件的提供程序

组合文件的提供程序是指当我们有多种文件数据来源的时候,可以将这些源合并为一个目录一样,让我们像在使用同一个目录一样使用我们的文件系统

源码链接:
https://github.com/witskeeper/geektime/tree/master/samples/FileProviderDemo

首先我们可以看一下 IFileProvider 的定义

namespace Microsoft.Extensions.FileProviders
{public interface IFileProvider{// 输入是一个相对的路径IFileInfo GetFileInfo(string subpath);// 获取指定目录下的目录信息IDirectoryContents GetDirectoryContents(string subpath);IChangeToken Watch(string filter);}
}

IDirectoryContents

namespace Microsoft.Extensions.FileProviders
{public interface IDirectoryContents : IEnumerable<IFileInfo>, IEnumerable{bool Exists { get; }}
}

这个接口实际上就是 IFileInfo 的一个集合,还有一个属性是否存在,表示当前目录是否存在,如果存在的话,我们可以从它内部枚举到我们的所有文件

IFileInfo

namespace Microsoft.Extensions.FileProviders
{public interface IFileInfo{bool Exists { get; }long Length { get; }string PhysicalPath { get; }string Name { get; }DateTimeOffset LastModified { get; }bool IsDirectory { get; }Stream CreateReadStream();}
}

IFileInfo 有几个属性:是否存在,文件长度,物理地址,文件名,最后修改时间,是否是一个目录(有可能获取到的文件并不是一个真实的文件,它可能是一个目录,那也就是用 IFileInfo 来代替的),读取文件流

接下来通过代码看一下

// 定义一个物理文件的提供程序,把我们当前应用程序的根目录映射出来
IFileProvider provider1 = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory);// 获取到这个目录下面的所有内容
var contents = provider1.GetDirectoryContents("/");foreach (var item in contents)
{// 打印文件名Console.WriteLine(item.Name);
}

启动程序可以看到控制台输出了编译目录下面的文件

FileProviderDemo.deps.json
FileProviderDemo.dll
FileProviderDemo.exe
FileProviderDemo.pdb
FileProviderDemo.runtimeconfig.dev.json
FileProviderDemo.runtimeconfig.json
Microsoft.Extensions.FileProviders.Abstractions.dll
Microsoft.Extensions.FileProviders.Composite.dll
Microsoft.Extensions.FileProviders.Embedded.dll
Microsoft.Extensions.FileProviders.Physical.dll
Microsoft.Extensions.FileSystemGlobbing.dll
Microsoft.Extensions.Primitives.dll

如果我们要读文件流的话,可以通过 CreateReadStream

foreach (var item in contents)
{// 读取文件流var stream = item.CreateReadStream();// 打印文件名Console.WriteLine(item.Name);
}

接下来看一下嵌入式的提供程序,它是指编译时把文件嵌入到程序集内部,就像源文件一样,但是与通常的资源文件不同的是,我们可以像读取目录一样读取我们的文件

IFileProvider provider2 = new EmbeddedFileProvider(typeof(Program).Assembly);

这里我们创建了一个 emb.html

<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head><meta charset="utf-8" /><title></title>
</head>
<body></body>
</html>

然后把它的属性设置为嵌入的资源,而不是内容

这样的设置的话,我们可以看一下对工程文件有什么影响

编辑项目可以看到我们把这个文件定义为嵌入式资源

  <ItemGroup><EmbeddedResource Include="emb.html" /></ItemGroup>

再次读取这个文件

IFileProvider provider2 = new EmbeddedFileProvider(typeof(Program).Assembly);var html = provider2.GetFileInfo("emb.html");

断点调试查看文件信息

可以看到 html 这个文件是否存在,是否目录,最后修改时间,长度,名字,物理路径

这就是可以通过嵌入式的文件提供程序来读取编译时构建到程序集里面的资源

最后一个就是组合文件提供程序,它的作用就是将各种提供程序组合成一个目录,让我们可以访问它

// 传入前面的两种文件提供程序到组合提供程序里面,它可以传入多个文件提供程序
IFileProvider provider = new CompositeFileProvider(provider1, provider2);var contents = provider.GetDirectoryContents("/");foreach (var item in contents)
{Console.WriteLine(item.Name);
}

启动程序可以看到,不仅输出了程序集,编译构建出来的文件,同时还输出资源文件 emb.html

FileProviderDemo.deps.json
FileProviderDemo.dll
FileProviderDemo.exe
FileProviderDemo.pdb
FileProviderDemo.runtimeconfig.dev.json
FileProviderDemo.runtimeconfig.json
Microsoft.Extensions.FileProviders.Abstractions.dll
Microsoft.Extensions.FileProviders.Composite.dll
Microsoft.Extensions.FileProviders.Embedded.dll
Microsoft.Extensions.FileProviders.Physical.dll
Microsoft.Extensions.FileSystemGlobbing.dll
Microsoft.Extensions.Primitives.dll
emb.html

这就说明可以像在访问同一个目录一样,访问不同的文件提供程序目录,这就意味着实际上是可以通过实现简单的 IFileProvider 和 IFileInfo 就可以实现自己的文件提供程序

这些文件提供程序举一个场景比如说可以通过 OSS 的这种远程存储的方式将文件读取出来并且提供给应用程序,但是应用程序并不需要做特殊的配置,只需要把 OSS 提供的程序注入到系统里面,只需要按照 IFileProvider 提供的接口来读取文件,就可以做到像在读取本地文件一样,也就是说可以借助这套框架读取任意位置的文件

.NET Core开发实战(第24课:文件提供程序:让你可以将文件放在任何地方)--学习笔记...相关推荐

  1. 笔记合并_.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)学习笔记(上)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 我们先来看一下静态文件中间件有哪些能力 1.支持指定相对路径 2.支持目录的浏览 3.支持设置默认文档 4.支持多目录映射 源码链接: http ...

  2. .NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(上)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 我们先来看一下静态文件中间件有哪些能力 1.支持指定相对路径 2.支持目录的浏览 3.支持设置默认文档 4.支持多目录映射 源码链接: http ...

  3. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  4. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core ...

  5. .NET Core开发实战(定义API的最佳实践)Source Generators版

    前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...

  6. 【Unity】动作游戏开发实战详细分析-24-流血喷溅程序

    [Unity]动作游戏开发实战详细分析-24-流血喷溅程序 溅落血迹效果 实现思路 利用对象池的代码设计思路,通过随机性来实现随机的溅落血迹效果. 代码 public class DripBloodF ...

  7. 习题 8.5 将本章的例8.4改写为一个多文件的程序:1.将类定义放在头文件arraymax.h中;2.将成员函数定义放在源文件arraymax.cpp中;3.主函数放在源文件file1.cpp中。

    C++程序设计(第三版) 谭浩强 习题8.5 个人设计 习题 8.5 将本章的例8.4改写为一个多文件的程序: 1.将类定义放在头文件arraymax.h中: 2.将成员函数定义放在源文件arraym ...

  8. .NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记

    10 | 环境变量配置提供程序:容器环境下配置注入的最佳途径 环境变量的配置提供程序主要适应场景: 1.在 Docker 中运行时 2.在 Kubernetes 中运行时 3.需要设置 ASP.NET ...

  9. .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记

    09 | 命令行配置提供程序:最简单快捷的配置注入方法 这一节讲解如何使用命令行参数来作为配置数据源 命令行配置(提供程序的)支持三种格式的命令 1.无前缀的 key=value 模式 2.双中横线模 ...

最新文章

  1. C++ OpenCV形态学操作--开闭操作,形态学梯度,顶帽,黑帽
  2. 10个有趣的javascript和css库(2019年5月最新)
  3. pandas dataframe缺失值(np.nan)处理:识别缺失情况、删除、0值填补、均值填补、中位数填补、加缺失标签、插值填充详解及实例
  4. 姚班代有才人出:清华本科生用“最简单的形式”,大幅提高少样本学习性能...
  5. Git 工具 - 子模块 外部引用
  6. 单片机汇编编程300例_pic单片机编程串烧,pic单片机汇编语言讲解下篇
  7. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战
  8. arm linux gcc 编译,Linux arm-linux-gcc交叉编译环境配置
  9. springboot2 使用hikaridatasource 并测试_基于Spring Boot 2.x的后端管理网站脚手,源码免费分享...
  10. 监督学习 | 集成学习 之AdaBoost、梯度提升及Slearn实现
  11. 汉诺塔 hanoi 如此简单
  12. SpringMvc-@ModelAttribute注解
  13. ruby所有版本下载地址
  14. 树莓派安装各种Ubuntu版本及系统推荐
  15. 关于微信授权获取昵称含Emoji表情引发的乱码问题总结
  16. 华为交换机配置ntp服务时间 自动同步不成功unsynchronized
  17. 【scratch】class_1_界面介绍
  18. 10种常见的HTML标签错误写法
  19. RK方案OTG口 OTG与HOST切换
  20. 【Python】PyQt5 Designer工具配置(前端界面设计工具)

热门文章

  1. ( function(){…} )()
  2. Oracle免客户端InstantClient安装使用
  3. wpf中的datagrid中如何显示图片
  4. 国外网站评出对程序员最具影响的书籍清单
  5. 面向全球用户的Teams app之夏令时篇
  6. ResourceManager中的Resource Estimator框架介绍与算法剖析
  7. 性能优化8--内存泄露
  8. Android Studio3.0简介
  9. 大数据服务社会的一个有益实践
  10. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题