zoukankan      html  css  js  c++  java
  • .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="EmbeddedFilesinfo.txt;EmbeddedFilesdate.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);
            }
  • 相关阅读:
    洛谷P4175 网络管理
    洛谷P2605 基站选址
    洛谷P3723 礼物
    bzoj3771 Triple
    洛谷P3321 序列统计
    bzoj2194 快速傅里叶之二
    1109课堂内容整理
    响应式网页
    表单隐藏域有什么作用?
    1106课堂笔记
  • 原文地址:https://www.cnblogs.com/yeqifeng2288/p/13096541.html
Copyright © 2011-2022 走看看