ASP.NET Core File Providers

ASP.NET Core通过对File Providers的使用实现了对文件系统访问的抽象。

查看或下载示例代码

File Provider 抽象

File Providers是文件系统之上的一层抽象。它的主要接口是IFileProviderIFileProvider公开了相应方法用来获取文件信息(IFileInfo), 目录信息(IDirectoryContents),以及设置更改通知(通过使用一个IChangeToken)。

IFileInfo接口提供了操作单个文件和目录的方法和属性。它有两个boolean属性,ExistsIsDirectory,以及两个描述文件的两个属性NameLength(按字节),还包括一个LastModified日期属性。你还可以通过CreateReadStream方法读取文件内容。

File Provider 实现

有三种对于IFileProvider的实现可供选择:物理式,嵌入式和复合式。物理式用于访问实际系统中的文件。嵌入式用于访问嵌入在程序集中的文件。 复合式则是对前两种方式的组合使用。

PhysicalFileProvider

PhysicalFileProvider提供了对物理文件系统的访问。它封装了System.IO.File类型,范围限定到一个目录及其子目录的所有路径。这类作用域会限制访问某个目录及其子目录,防止作用域以外的其他操作访问文件系统。当实例化此类provider时,你必须为它提供一个目录路径,以供服务器拿来当做由这个provider发出的所有请求的基础路径(这个provider会限制路径以外的访问请求)。在一个ASP.NET Core应用,你可以直接实例化出一个PhysicalFileProvider provider,或者你也可以通过在控制器和服务中使用构造函数依赖注入的方式,请求一个IFileProvider接口。后者生成的解决方案通常更灵活以及更便于测试。

要创建一个PhysicalFileProvider其实很简单,只需要对其实化,再传递给它一个物理路径。之后你就可以通过它的目录遍历内容或提供子路径获取特定文件的信息。

IFileProvider provider = new PhysicalFileProvider(applicationRoot);
IDirectoryContents contents = provider.GetDirectoryContents(""); // the applicationRoot contentsIFileInfo fileInfo = provider.GetFileInfo("wwwroot/js/site.js"); // a file under applicationRoot

为了在控制器中请求一个provider,需要在控制器的构造函数中指定类型参数并赋值给本地属性。之后你就可以在你的动作器方法中使用本地实例了。

public class HomeController : Controller{    private readonly IFileProvider _fileProvider;    public HomeController(IFileProvider fileProvider)    {_fileProvider = fileProvider;}    public IActionResult Index()    {        var contents = _fileProvider.GetDirectoryContents("");        return View(contents);}
}

在应用的Startup类中创建provider的代码如下:

using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;

namespace FileProviderSample{  

   public class Startup{      
     private IHostingEnvironment _hostingEnvironment;        
   
     public Startup(IHostingEnvironment env)        {  
              var builder = new ConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true).AddEnvironmentVariables();Configuration = builder.Build();_hostingEnvironment = env;}      
              
       public IConfigurationRoot Configuration { get; }        // This method gets called by the runtime. Use this method to add services to the container.
                                                                                                                                                                                                                                                                                                                                                                                                                                               
public void ConfigureServices(IServiceCollection services)        {            // Add framework services.                                                                                                                                                                                                                                                                                                                                                                                                                                 services.AddMvc();            var physicalProvider = _hostingEnvironment.ContentRootFileProvider;            var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());            var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider);            // choose one provider to use for the app and register it//services.AddSingleton<IFileProvider>(physicalProvider);//services.AddSingleton<IFileProvider>(embeddedProvider);services.AddSingleton<IFileProvider>(compositeProvider);}} }      

在 Index.chhtml 视图中,可以遍历操作IDirectoryContents模型参数

@using Microsoft.Extensions.FileProviders @model  IDirectoryContents<h2>Folder Contents</h2><ul>    @foreach (IFileInfo item in Model)    {        if (item.IsDirectory)        {            <li><strong>@item.Name</strong></li>        }        else        {            <li>@item.Name - @item.Length bytes</li>        }    }</ul>

结果如下:

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 658px; height: 534px;">

EmbeddedFileProvider

EmbeddedFileProvider用于访问嵌入到程序集中的文件。在.NET Core中,你可以通过修改 project.json 文件的buildOptions属性参数来把文件嵌入到程序集中。

"buildOptions": {  "emitEntryPoint": true,  "preserveCompilationContext": true,  "embed": [    "Resource.txt",    "**/*.js"]
}

当你把文件嵌入到程序集中时,你可以使用通配符模式。这些模式可以被用来匹配一个或多个文件。

Note
把项目中所有的.js文件都嵌入到项目程序集里的情况是不太可能发生的,以上示例仅作为demo给出。

当创建一个EmbeddedFileProvider时,请在其构造函数中传入一个程序集实例供其读取。

var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());

以上的代码片段描述了如何创建一个能访问当前工作程序集的EmbeddedFileProvider类型变量。

使用EmbeddedFileProvider更新示例项目代码后的输出结果如下:

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 658px; height: 534px;">

Note
如上图所示,嵌入式资源不会公开目录。相反的,资源路径(经由资源的命名空间)会被嵌入到它的文件名中并以.作为分隔符。

Tip
EmbeddedFileProvider构造器接受一个可选的baseNamespace参数,指定此参数将限定GetDirectoryContents方法调用该命名空间下的资源。

CompositeFileProvider

CompositeFileProvider联合IFileProvider实例公开了一个单一的接口,用以和来自多种provider的文件工作。当创建一个CompositeFileProvider时,你可以为它的构造函数传入一个或多个IFileProvider实例。

var physicalProvider = _hostingEnvironment.ContentRootFileProvider;var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider);

使用包含物理式provider(在前)和嵌入式provider的CompositeFileProvider更新示例项目代码后的输出结果如下:

frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 658px; height: 846px;">

查看更改

IFileProviderWatch方法能用来查看一个或多个文件/目录的更改信息。Watch方法接受一个路径字符串,它也可以使用通配符模式来指定多个文件,Watch方法最终返回一个IChangeToken。这个token公开了一个HasChanged属性用以检视状态,公开了一个RegisterChangeCallback方法,此方法会在指定的路径字符串检测到更改时被调用。请注意每个更改token只调用其关联回调以响应单次更改。为了使监控持续,你可以使用如下所示的TaskCompletionSource方法,或者重建IChangeToken以响应更改。

在这个文章的示例中,无论何时当文本文件内容发生修改,按如下代码配置的console应用都会显示相应的信息。

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Primitives;

namespace
WatchConsole{  
    public class Program{      
      private static PhysicalFileProvider _fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());        public static void Main(string[] args)        {Console.WriteLine("Monitoring quotes.txt for changes (ctrl-c to quit)...");            while (true){MainAsync().GetAwaiter().GetResult();}}      
      
       private static async Task MainAsync()        {IChangeToken token = _fileProvider.Watch("quotes.txt");            var tcs = new TaskCompletionSource<object>();token.RegisterChangeCallback(state => ((TaskCompletionSource<object>)state).TrySetResult(null), tcs);            await tcs.Task.ConfigureAwait(false);Console.WriteLine("quotes.txt changed");}} }

以下是执行过几次文本保存动作后的运行结果截图:
frameborder="0" scrolling="no" style="border-width: initial; border-style: none; width: 658px; height: 345px;">

Note
有一些文件系统,例如Docker容器和网络共享,可能不能很可靠地发送更改通知。设置环境变量DOTNET_USE_POLLINGFILEWATCHER的值为1true,使得每四秒轮询一次文件系统的变更。

通配符模式

文件系统路径规则使用叫作globbing patterns的通配符模式,这类简单模式可以被用来指定文件组。这两个通配符分别是***

*
*表示在当前文件夹级别上匹配任何文件名称或文件扩展名。匹配以文件路径字符串中的/.符号结尾。

**
**表示在多个目录级别上匹配任何文件名称或文件扩展名。可用于在一个目录层次结构中递归地匹配多个文件。

通配符模式示例

directory/file.txt

在指定的文件夹中匹配指定的文件。

directory/*.txt

在指定的文件夹中匹配所有以.txt扩展名结尾的文件。

directory/*/project.json

在指定的directory文件夹下的一级目录位置中匹配所有符合project.json名称的文件

directory/**/*.txt

在指定的directory文件夹下的所有位置中匹配所有以.txt扩展名结尾的文件。

在ASP.NET Core中File Provider的用法

ASP.NET Core有几个组件使用file provider功能。IHostingEnvironmentIFileProvider接口类型公开了应用的目录根和Web根。静态文件中间件使用file provider来定位静态文件。Razor更是大量使用IFileProvider来定位视图。Dotnet的发布功能使用file provider和通配符模式来指定需要跟随发布的文件。

在应用程序中使用的建议

如果你的ASP.NET Core应用需要访问文件系统,你可以通过依赖注入创建IFileProvider接口实例,然后再通过前文所示的相应方法执行访问。当应用启动的时候,这些方法允许你一次性配置provider并减少应用初始化时生成的实例类型数目。

原文地址:http://www.cnblogs.com/Wddpct/p/6128386.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

转载自 java并发编程&#xff08;二十一&#xff09;----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍 这一节我们来接着介绍JUC集合&#xff1a;CopyOnWriteArraySet和ConcurrentSkipListSet。从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOnWrit…

linux u32,如何在程序中使用u32这个类型啊。

如何在程序中使用u32这个类型啊。 我用的keil 4.5#include "stm32f10x.h"int main(void){GPIO_InitTypeDef GPIO_Init1;GPIO_Init1.GPIO_Pin GPIO_Pin_0;GPIO_Init1.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init1.GPIO_Mode GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPI…

虚拟机安装CentOS-7-x86_64-DVD-1708说明

https://blog.csdn.net/guanzhuwo/article/details/105903844 镜像已经下载了 使用IDM下载 http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso 虚拟机安装CentOS-7-x86_64-DVD-1708说明 guanzhuwo 2020-05-03 15:12:22 102 收藏 分类专栏&a…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——DeptDao层代码

下面来看看DeptDao 的事例吧&#xff1a; IDeptDao.java: /** * Title: IDeptDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-4-19 下午6:37:00 * version V1.0 */ package org.dao;impo…

IJ实现侧边栏单独搜索

第一步任意点击一个 第二步输入要搜索的单词

关于全局ID,雪花(snowflake)算法的说明

C#版本的国外朋友已经封装了&#xff0c;大家可以去看看&#xff1a;https://github.com/ccollie/snowflake-net 强大的网友出来个简化版本&#xff1a;http://blog.csdn.net/***/article/details/*** &#xff08;地址我就不贴了&#xff0c;对前辈需要最起码的尊敬&#xff0…

Java并发包:ConcurrentMap

转载自 Java并发包&#xff1a;ConcurrentMap 文章译自&#xff1a;http://tutorials.jenkov.com/java-util-concurrent/index.html 抽空翻译了一下这个教程的文章&#xff0c;后面会陆续放出&#xff0c;如有不妥&#xff0c;请批评指正。 转自请注明出处。 之前漏了一篇文…

SecureCRT的下载、安装( 过程非常详细!!值得查看)

我自己百度联通主号有存储了 可以下下来 有视频加这个文档 就可以了 https://blog.csdn.net/qq_39052513/article/details/100272502 SecureCRT的下载、安装&#xff08; 过程非常详细&#xff01;&#xff01;值得查看&#xff09; 置顶 超Ren专属 2020-06-02 21:29:33 1…

整合Druid---SpringBoot

整合Druid(数据源) Druid简介 Java程序很大一部分要操作数据库&#xff0c;为了提高性能操作数据库的时候&#xff0c;又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;结合了 C3P0、DBCP 等 DB 池的优点&#xff0c;同时加入了日志…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类

次此篇文章是两个工具类的实现&#xff0c;HibernateUtil.java和分页的工具类PageUtil.java的实现&#xff1a; 先看看HibernateUtil.java的实现&#xff1a; package org.util;import javax.transaction.Transaction;import org.hibernate.Session; import org.hibernate.Sess…

理想的互联网服务后台框架的九个要点

理想的互联网服务后台框架的九个要点对于互联网服务后台团队&#xff0c;开发框架的选择是非常关键的一个问题&#xff0c;多年的海量服务经验和教训使得我们团队深刻的认识到&#xff1a; 要尽早规范团队的开发服务框架&#xff0c;避免到了后期&#xff0c;各种开发语言混杂、…

linux 无线网卡驱动桥转发,引用和完美转发

# 右值引用 移动语意~~~右值引用解决了左值引用无法传递临时对象和常引用传递的对象只读的问题. 右值引用允许传递一个可变的临时对象引用.移动构造使用移动而非赋值语义完成构造过程, 主要用于解决函数返回值时的大量深拷贝开销.#include int main(void){int a 30;int &b…

虚拟机安装centeros7 无法连接网络 virsh命令找不到 删除多余的vir0 不然dubbo会有问题

进入linux ping www.baidu.com 无法访问 cd /etc/sysconfig/network-scripts vi ifcfg-ens33 修改这个文件 onbootyes 原来是on shutdown -h now 关机 然后重启虚拟机 再次ping ping www.baidu.com 就通了 https://www.zhihu.com/question/53708440 virsh命令找…

Java集合之EnumSet

转载自 Java集合之EnumSet EnumSet EnumSet 是一个专为枚举设计的集合类&#xff0c;EnumSet中的所有元素都必须是指定枚举类型的枚举值&#xff0c;该枚举类型在创建EnumSet时显式或隐式地指定。 EnumSet的集合元素也是有序的&#xff0c;EnumSet以枚举值在Enum类内的定义顺…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——OpSessionview实现

此过滤器的功能就是让Session始终保持着一个打开的状态&#xff1a; /** * Title: OpenSessionFilter.java * Package org.web * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-4-19 下午6:51:37 * version V1.0 */ pa…

yaml配置文件整合Mybatis易错点

配置 mybatis:type-aliases-package: com.kuang.pojomapper-locations: classpath:mybatis/mapper/*.xml容易写成以下格式导致出错 mybatis:type-aliases-package: com.kuang.pojomapper-locations: classpath: mybatis/mapper/*.xml

Azure 部署 Asp.NET Core Web App

在云计算大行其道的时代&#xff0c;当你在部署一个网站时&#xff0c;第一选择肯定是各式各样的云端服务。那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core 的网站呢&#xff1f;Azure 的 Web App 服务是个很好的选择。 下面我们会通过 Visual Studio…

联想linux笔记本评测,联想(lenovo)G460AL-ITH Linux笔记本电脑CPU测试评测-ZOL中关村在线...

这颗英特尔最新的Core i5 430M双核心处理器基于32nm工艺&#xff0c;核心代号为Arrandate&#xff0c;主频为2.27GHz&#xff0c;共享的三级缓存为3MB。在开启睿频加速时&#xff0c;单核心的主频最高为2.53GHz&#xff0c;并且支持同步超线程技术。同时除了支持上一代处理器所…

SecureCRT连接Linux的操作步骤

https://www.cnblogs.com/Koma-vv/p/11100565.html SecureCRT连接Linux的操作步骤 虚拟机待机&#xff1a;Ctrlg进入 ipconfig是Windows里面的操作 ifconfig是Linux里面的操作 解决方法&#xff1a;右键&#xff1a; 打开终端是&#xff1a;在桌面上&#xff0c;鼠标右键才可…

聊聊并发(四)深入分析ConcurrentHashMap

转载自 聊聊并发&#xff08;四&#xff09;深入分析ConcurrentHashMap 术语定义 术语英文解释哈希算法hash algorithm是一种将任意内容的输入转换成相同长度输出的加密方式&#xff0c;其输出被称为哈希值。 哈希表hash table根据设定的哈希函数H(key)和处理冲突方法将一组…