ASP.NET Core 2.0 本地文件操作问题及解决方案

问题

如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息?

答案

新建一个空项目,修改Startup类,添加访问本地文件所需的服务:

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

创建一个中间件,读取根目录下的所有文件,输出文件名:

public class HelloFileProviderMiddleware
{
 private readonly RequestDelegate _next;
 private readonly IFileProvider _fileProvider;
 public HelloFileProviderMiddleware(RequestDelegate next, IFileProvider fileProvider)
 {
  _next = next;
  _fileProvider = fileProvider;
 }
 public async Task Invoke(HttpContext context)
 {
  var output = new StringBuilder("");
  IDirectoryContents dir = _fileProvider.GetDirectoryContents("");
  foreach (IFileInfo item in dir)
  {
   output.AppendLine(item.Name);
  }
  await context.Response.WriteAsync(output.ToString());
 }
}
public static class UseHelloFileProviderExtensions
{
 public static IApplicationBuilder UseHelloFileProvider(this IApplicationBuilder app)
 {
  return app.UseMiddleware<HelloFileProviderMiddleware>();
 }
}

运行,此时页面效果:

当然,我们也可以通过IFileProvider接口读取单个文件信息:

public class HelloFileProviderMiddleware
{
 private readonly RequestDelegate _next;
 private readonly IFileProvider _fileProvider;
 public HelloFileProviderMiddleware(RequestDelegate next, IFileProvider fileProvider)
 {
  _next = next;
  _fileProvider = fileProvider;
 }
 public async Task Invoke(HttpContext context)
 {
  IFileInfo file = _fileProvider.GetFileInfo("Startup.cs");
  using (var stream = file.CreateReadStream())
  {
   using (var reader = new StreamReader(stream))
   {
    var output = await reader.ReadToEndAsync();
    await context.Response.WriteAsync(output.ToString());
   }
  }
 }
}

运行,此时页面效果:

讨论

ASP.NET Core 2.0提供了继承自接口IFileProvider的PhysicalFileProvider类型,用于受限地访问本地文件系统,它是对System.IO.File的一个封装。

我们可以在Startup的Configure()方法内将IFileProvider配置为一个服务,然后通过构造函数注入添加到中间件或者控制器中。这样可以在一个地方控制文件的访问路径(也就是应用程序启动的时候)。

IFileProvider有两个重要的方法:

1. GetDirectoryContents:返回IDirectoryContents接口。可用于遍历某个目录中的全部文件或目录。

2. GetFileInfo:返回IFileInfo接口。通过其CreateReadSteam方法可以读取文件内容。

====start by sanshi=========================

下面通过递归来遍历根目录下全部文件和目录,修改中间件代码:

public class HelloFileProviderMiddleware
{
 private readonly RequestDelegate _next;
 private readonly IFileProvider _fileProvider;
 public HelloFileProviderMiddleware(RequestDelegate next, IFileProvider fileProvider)
 {
  _next = next;
  _fileProvider = fileProvider;
 }
 public async Task Invoke(HttpContext context)
 {
  var output = new StringBuilder("");
  ResolveDirectory(output, "", "");
  await context.Response.WriteAsync(output.ToString());
 }
 private void ResolveDirectory(StringBuilder output, string path, string prefix)
 {
  IDirectoryContents dir = _fileProvider.GetDirectoryContents(path);
  foreach (IFileInfo item in dir)
  {
   if (item.IsDirectory)
   {
    output.AppendLine(prefix + "[" + item.Name + "]");
    ResolveDirectory(output,
     item.PhysicalPath.Substring(Directory.GetCurrentDirectory().Length),
     prefix + " ");
   } else
   {
    output.AppendLine(prefix + item.Name);
   }
  }
 }
} 

运行,此时页面效果:

====end by sanshi=========================

源代码下载

总结

以上所述是小编给大家介绍的ASP.NET Core 2.0 本地文件操作问题及解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • ASP.NET Core Razor 页面路由详解

    在服务器端 Web 应用程序框架中,其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配,以便正确的处理请求.最简单的方法是将 URL 映射到磁盘上的物理文件,在 Razor 页面框架中,ASP.NET团队就是这样实现的. 关于 Razor 页面框架如何将 URL 与文件相匹配,有一些规则您必须了解,以及如何根据需要自定义规则改变输出的结果.如果您将 Razor 页面与 Web Form 框架进行比较,您还需要了解取代的 Ur l参数以及在URL中传递数据的机制. 规则一,Razor

  • 浅谈ASP.Net Core WebApi几种版本控制对比

    一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或作为查询字符串参数, (2)通过自定义标头和通过接受标头 在这篇文章中, 让我们来看看如何支持多个版本的 ASP.NET Core Web API. 一.创建asp.net core webapi 项目,引用NuGet包:Install-Package Microsoft.AspNetCore

  • asp.net core MVC 过滤器之ActionFilter过滤器(2)

    本系类将会讲解asp.net core MVC中的内置过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过滤器

  • 详解ASP.NET Core 中的多语言支持(Localization)

    首先在 Startup 的 ConfigureServices 中添加 AddLocalization 与 AddViewLocalization 以及配置 RequestLocalizationOptions (这里假设使用英文与中文): public void ConfigureServices(IServiceCollection services) { services.AddLocalization(options => options.ResourcesPath = "Reso

  • ASP.NET Core 2.0 本地文件操作问题及解决方案

    问题 如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息? 答案 新建一个空项目,修改Startup类,添加访问本地文件所需的服务: public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IFileProvider>( new PhysicalFileProvider(Directory.GetCurrentDirectory())); } 创建一个中间件,读取根目

  • [译]ASP.NET Core 2.0 网址重定向的方法

    问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter): public void Configure(IApplicationBuilder app, IHostingEnvironment env) { var rewrite = new RewriteOptions() .AddRedirect("films", "movies

  • ASP.NET Core 2.0 使用支付宝PC网站支付实现代码

    前言 最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的源码,用.NET Standard 2.0 实现了支付宝服务端SDK,Alipay.AopSdk.Core(github:https://github.com/stulzq/Alipay.AopSdk.Core) ,支持.NET CORE 2.0.为了使用方便,已上传至Nuget可以直接使用. 支付

  • Centos7+Docker+Jenkins+ASP.NET Core 2.0自动化发布与部署的实现

    前言 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将Jenkins搬到Docker上.为什么要写这篇文章呢?因为找过相关的资料,大多数文章都是基于Ubuntu 安装.net core 又或者 GitLab 进行持续集成 自动部署等等等,并未有人尝试过Centos7.3 上部署 Jenkins 并且 构建 ASP.NET CORE 2

  • 详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopmen

  • 详解ASP.NET Core 2.0 视图引擎(译)

    问题 如何在ASP.NET Core 2.0中使用Razor引擎来创建视图? 答案 新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelo

  • 浅谈ASP.NET Core 2.0 布局页面(译)

    本文介绍了ASP.NET Core 2.0 布局页面,分享给大家,具体如下: 问题 如何在ASP.NET Core 2.0项目中共享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public interface IGreetingService { string Greet(string firstname, string surname); } public class GreetingService : IGre

  • ASP.NET Core 2.0 支付宝扫码支付的实现代码

    前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等.我本人是很喜欢.net的,并希望.net core能够崛起.我是从.net core 1.1的时候开始使用的,到现在的.net core 2.0..net core 2.0比1.1有了一些改变,api也增加了很多,用着更顺手了,最近在做asp.net core 对接支付宝,百度了一下没找到关于core的支付宝支付相关资料,所以

  • Amazing ASP.NET Core 2.0

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着功能已经基本确定,还没有学习过 ASP.NET Core 的同学可以直接从 2.0 开始学起,但是如果你已经掌握了 1.0 的话,那么你只需要了解在 2.0 中增加和修改的一些功能即可. 每一次大版本的发布和升级,总会带给开发人员一些惊喜和令人兴奋的特性,有关 ASP.NET Core 本次的 2.

  • ASP.NET Core 1.0 部署 HTTPS(.NET Core 1.0)

    最近要做一个项目,正逢ASP.Net Core 1.0版本的正式发布.由于现代互联网的安全要求,HTTPS加密通讯已成主流,所以就有了这个方案. 本方案启发于一个旧版的解决方案: ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1) http://www.cnblogs.com/qin-nz/p/aspnetcore-using-https-on-dnx451.html?utm_source=tuicool&utm_medium=referral  在

随机推荐