.NET Core开发实战课程备忘(16) -- 文件提供程序:让你可以将文件放在任何地方

核心类型

  • IFileProvider:用来访问各种各样文件的提供程序的接口,通过这样抽象的定义,让我们与具体的文件的读取代码进行隔离,这样的好处是我们可以从不同的地方读取文件,不仅仅是本地物理文件,也可以是嵌入式文件,甚至是云端上面的其他API提供的文件
  • IFileInfo
  • IDirectoryContents

内置文件提供程序

  • PhysicalFileProvider:物理文件的提供程序
  • EmbeddedFileProvider:嵌入式的提供程序
  • CompositeFileProvider:组合文件的提供程序,当我们由多个数据源来提供文件的手,可以将这些源合并为一个目录

代码实现

创建项目

创建名字为FileProviderDemo控制台应用,通过nuget引入以下四个包:

1
2
3
4
Microsoft.Extensions.FileProviders.Abstractions
Microsoft.Extensions.FileProviders.Composite
Microsoft.Extensions.FileProviders.Embedded
Microsoft.Extensions.FileProviders.Physical

创建PhysicalFileProvider

Program.Main方法中新增以下代码:

1
2
3
4
5
6
var phyProvider = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory);
var contents = phyProvider.GetDirectoryContents("/");
foreach (var item in contents)
{
Console.WriteLine(item.Name);
}

运行代码,可以看到控制台打印出类似以下信息:

1
2
3
4
5
6
7
8
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

创建EmbeddedFileProvider

在项目根目录创建一个emb.html的文件,右键emb.html文件->属性->生成操作选择为嵌入的资源,然后在上面的测试代码后面追加以下代码:

1
2
3
var embProvider = new EmbeddedFileProvider(typeof(Program).Assembly);
var html = embProvider.GetFileInfo("emb.html");
Console.WriteLine($"获取到嵌入式文件:{html.Exists}");

运行代码可以看到除了上一步打印的信息外,还有打印出了以下信息:

1
获取到嵌入式文件:True

创建CompositeFileProvider

继续上面的测试代码后面新增以下代码:

1
2
3
4
5
6
7
Console.WriteLine("=====↓CompositeFileProvider↓=====");
var compositeProvider = new CompositeFileProvider(phyProvider, embProvider);
var comContent = compositeProvider.GetDirectoryContents("/");
foreach (var item in comContent)
{
Console.WriteLine(item.Name);
}

运行代码可以看到除了前两步打印的信息外,还打印了以下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
=====↓CompositeFileProvider↓=====
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