ASP.NET Core 具有很多针对文件读取的应用。比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取。如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目标文件的内容并对请求予以响应。在一个ASP.NET Core MVC应用中,针对View的动态编译会涉及到根据预定义的路径映射关系来读取目标View。这些不同应用场景都会出现一个FileProvider对象的身影,以此对象为核心的文件系统提供了统一的API来读取文件的内容并监控内容的改变。 [ 本文已经同步到《ASP.NET Core框架揭秘》之中]
目录
一、一个抽象的“文件系统”
二、呈现文件系统的结构
三、读取物理文件内容
四、读取内嵌于程序集中的文件内容
五、监控文件的变化
本章所谓的“文件系统”有点名不副实,其实根本算不上一个系统,它仅仅是利用一个抽象化的FileProvider以统一的方式提供所需的文件而已。不过笔者实在想不到一个更为贴切的描述短语,所以还是姑且称之为文件系统吧(github上对应的项目名称就叫FileSystem)。作为文件系统的核心,FileProvider是对所有实现了IFileProvider接口的所有类型以及对应对象的统称。正式因为FileProvider自身是个抽象的对象,所以由它构建的也是一个抽象的文件系统。
这个文件系统采用目录的方式来组织和规划文件,但是这里所谓的目录和文件都是一个抽象的概念,并非对一个具体物理目录和文件的映射。文件系统的目录仅仅是文件的逻辑容器,而文件可能对应一个物理文件,也可能保存在数据库中,或者来源于网络,甚至有可能根本就不能存在,其内容需要在读取时动态生成。为了让读者朋友们能够对这个文件系统具有一个大体认识,我们先来演示几个简单的实例。
二、呈现文件系统的结构
文件系统中的文件以目录的形式进行组织,一个FileProvider可以视为针对一个根目录的映射。目录除了可以存放文件之外,还可以包含多个子目录,所以目录/文件在整体上呈现出树形层细化结构。接下来我们利用提供的FileProvider对象并将它映射到一个物理目录,最终将所在目录的整个结构呈现出来。
我们创建一个控制台应用,并添加相应的NuGet包。由于IFileProvider接口定义在“Microsoft.Extensions.FileProviders.Abstractions”这个NuGet包中,针对物理文件的FileProvider(PhysicalFileProvider)所在的NuGet包名为“Microsoft.Extensions.FileProviders.Physical”,所以我们只需要添加后者的依赖即可。除此之外,我们将采用针对依赖注入的编程方式,我们还添加了针对“Microsoft.Extensions.DependencyInjection”这个NuGet包的依赖。如下所示的是针对这两个NuGet包的依赖在project.json文件中的定义。
1: {
2: ...
: {
4: ...
,
7: },
8: ...
9: }