.net core中的内嵌资源以及IFileProvider

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);
        }

 

posted @ 2020-06-11 22:35  指左转右  阅读(1370)  评论(2编辑  收藏  举报