IFileProvider
命名空间在 Microsoft.Extensions.FileProviders。
这个接口主要有三个方法: GetDirectoryContents 列出虚拟路径上的文件夹,GetFileInfo文件信息,可以使用CreateReadStream读取相应的文件流。watch 监控文件更改,似乎是使用文件的修改日期访问的。
这个接口可以自定义重写,比如支持网络路径,数据库路径等等。
不过今天先记录下.net core的内嵌资源。
内嵌资源:将资源文件在编译的是嵌入.dll文件中。
.net core中内嵌资源很简单,只需要在项目文件.csproj
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup> <ItemGroup>
<!--内嵌资源,多个文件用;分开。也支持通配符*.txt等。--> <EmbeddedResource Include="EmbeddedFiles\info.txt;EmbeddedFiles\date.txt" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.5" /> </ItemGroup> </Project>
内嵌资源是没有目录层级的,如果使用EmbeddedFileProvider处理这些资源,则默认情况下,路径为基础命名空间+.xxx.xx这样的格式。比如上面的date.txt则为:EmbededFiles.date.txt。
如果使用Assembly的方法,则为:EmbeddedFileDemo.EmbeddedFiles.date.txt
下面的代码展示了如何去读取内部的信息。
var assembly = typeof(Program).Assembly; // 读取文件流。 foreach (var item in assembly.GetManifestResourceNames()) { using var stream = assembly.GetManifestResourceStream(item); using var streamReader = new StreamReader(stream); var content = streamReader.ReadToEnd(); Console.WriteLine(content); } var embeddedFileProvider = new EmbeddedFileProvider(assembly, nameof(EmbeddedFileDemo)); // 由于内嵌文件资源不存在目录结果,只有使用空字符串和/才能获取到文件,其他情况都将返回NotFoundDirectoryContents var files = embeddedFileProvider.GetDirectoryContents(string.Empty); if (files.Exists) { using var fileInfoList = files.GetEnumerator(); while (fileInfoList.MoveNext()) { var stream = fileInfoList.Current.CreateReadStream(); ShowContent(stream); } } } private static void ShowContent(Stream stream) { using var streamReader = new StreamReader(stream); var content = streamReader.ReadToEnd(); Console.WriteLine(content); }