ASP.Net Core 为了便于获取文件和文件夹信息,监视文件变更, 在文件系统中提供了一个抽象层:File Providers, 这篇文章将会讨论如何使用 File Providers 。

File Provider 抽象层

file prodivers 实现了 IFileProvider 接口,它的实现子类大概有三块: Physical,EmbeddedComposite ,同时这个接口提供了可用于获取文件和文件夹的相关信息的方法,接口定义如下:

public interface IFileProvider{IDirectoryContents GetDirectoryContents(string subpath);IFileInfo GetFileInfo(string subpath);IChangeToken Watch(string filter);}

如果要实现 更改通知,还需要用 IChangeToken 接口,代码如下:

public interface IChangeToken{bool ActiveChangeCallbacks { get; }bool HasChanged { get; }IDisposable RegisterChangeCallback(Action<object> callback, object state);}

下面是 IFileProvider 接口的三个具体实现及应用,罗列如下:

  • PhysicalFileProvider

用于对 物理文件 的访问

  • EmbeddedFileProvider

用于对 程序集 内的文件访问

  • CompositeFileProvider

实现前面两者的混合访问

使用 PhysicalFileProvider

要想在 ASP.Net Core 中演示 PhysicalFileProvider,首先将其注入到 ServiceCollection 容器中,如下代码所示:

public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();IFileProvider physicalProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());services.AddSingleton<IFileProvider>(physicalProvider);}

注入到容器后,现在就可以在 Controller 使用依赖注入获取实例了,如下代码所示:

public class HomeController : Controller{private readonly ILogger<HomeController> _logger;private readonly IFileProvider _fileProvider;public HomeController(ILogger<HomeController> logger, IFileProvider fileProvider){_logger = logger;this._fileProvider = fileProvider;}}

下面在 Index 方法中使用 GetDirectoryContents() 来获取当前项目文件夹下的所有文件,如下代码所示:

public IActionResult Index(){List<string> lst = new List<string>();var contents = _fileProvider.GetDirectoryContents("");foreach (IFileInfo fileInfo in contents){lst.Add(fileInfo.Name);}return View();}

使用 EmbeddedFileProvider

顾名思义,它就是用来访问注入到 程序集 中的文件,下面的代码展示了如何将 EmbeddedFileProvider 注入到 ASP.Net Core 的容器中,如下代码所示:

public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();IFileProvider embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());services.AddSingleton<IFileProvider>(embeddedProvider);}

使用 CompositeFileProvider

看到 Composite 单词,是不是想起了设计模式中的 组合模式,对的,这里 CompositeFileProvider 也是类似的操作手法,它可以将一个或者多个的 EmbeddedFileProvider 和 PhysicalFileProvider 进行组合,进而合成一个  CompositeFileProvider 供上层进行访问,如果有点懵的话,可参考如下代码:


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

总的来说,你可以利用 File Providers 来获取文件或文件夹的信息,同时也可以实现变更通知,如果想在 ASP.Net Core 中实现文件系统访问,可以通过依赖注入的方式按需使用你的 File Provider。

译文链接:https://www.infoworld.com/article/3307516/how-to-use-file-providers-in-aspnet-core.html

如何在 ASP.Net Core 中使用 File Providers相关推荐

  1. 如何在ASP.NET Core中自定义Azure Storage File Provider

    主题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者: Lamond Lu 地址:  https://www.cnblogs.com/lwqlun/ ...

  2. asp绑定gridview属性_如何在ASP.NET Core中自定义Azure Storage File Provider

    主题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者: Lamond Lu 地址:  https://www.cnblogs.com/lwqlun/ ...

  3. 如何在 ASP.Net Core 中使用 MediatR

    MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯, ...

  4. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  5. 如何在ASP.NET Core中编写自定义日志记录提供程序

    目录 介绍 如何实现所需的接口 基础类和附件 FileLoggerProvider具体类及其附件 1. ConfigureLogging() 2. appsettings.json文件 介绍 源代码可 ...

  6. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  7. 如何在 ASP.Net Core 中使用 Autofac

    依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...

  8. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  9. 如何在 ASP.Net Core 中对接 WCF

    在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三 ...

最新文章

  1. SAP WM 执行VL06P为交货单创建组,报错-TO for multiple deliveries only with delayed delivery update-
  2. python django事务transaction源码分析
  3. linux如何使用vim显示行号语法高亮,(.vimrc简单使用)
  4. 单元测试之Mockito与PowerMock
  5. java 数组去重_java面试题:数组去重
  6. androidstudio jni开发_高考失利落榜,7年Android开发现已年薪60w,我的逆袭之路想说给你听...
  7. Atitit 异常机制与异常处理的原理与概论
  8. 记账时,如何对开销进行分类
  9. k8s之liveness and readness
  10. 金山词霸 for linux,在Linux下使用金山词霸2003
  11. 日积(Running)月累(ZSSURE):看山不是山看水不是水,2017
  12. java多属性的map_java集合(四)Map集合之Properties详解
  13. Excel 文字转拼音
  14. Matlab/simulink 风电风机一次调频,变桨控制,变风速调频对比,转子动能控制,虚拟惯性控制,风机内部控制详细,频域模型,DFIG,PMSG
  15. 喜迎国庆-好礼大放送
  16. 收藏:不错的数据中台建设方法论
  17. 换行和禁止换行及超出省略号
  18. 视频网站开发:JavaWeb做一个带自定义小表情的评论功能
  19. C++长整型(long long)64位整型耗时问题
  20. ceph radosgw-admin的操作

热门文章

  1. 中文分词入门之字标注法4
  2. Codeforces 1066 C(思维)
  3. 8 旋转数组的最小数字
  4. CAP理论与MongoDB一致性、可用性的一些思考
  5. Linux中常用的操作指令(随时更新)
  6. Google:推荐几款好用的Chrome浏览器插件
  7. 因特网使用期限_Internet死亡时使用PC的其他方式
  8. 如何在Android TV上自定义推荐行
  9. java获取前端json数据_java如何获取前端ajax传来的json对象
  10. 3月6日云栖精选夜读:如何实现32.5万笔/秒的交易峰值?阿里交易系统TMF2.0技术揭秘...