问题

如何在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=========================

源代码下载

原文:https://tahirnaushad.com/2017/08/18/asp-net-core-file-providers/

[译]ASP.NET Core 2.0 本地文件操作的更多相关文章

  1. [译]ASP.NET Core 2.0 系列文章目录

    基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...

  2. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

  3. [译]ASP.NET Core 2.0 全局配置项

    问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...

  4. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  5. [译]ASP.NET Core 2.0 网址重定向

    问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter) ...

  6. [译]ASP.NET Core 2.0 路由引擎之网址生成

    问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServi ...

  7. [译]ASP.NET Core 2.0 视图引擎

    问题 如何在ASP.NET Core 2.0中使用Razor引擎来创建视图? 答案 新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件: public void ConfigureS ...

  8. [译]ASP.NET Core 2.0 布局页面

    问题 如何在ASP.NET Core 2.0项目中共享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public int ...

  9. [译]ASP.NET Core 2.0 视图组件

    问题 如何在ASP.NET Core 2.0中使用视图组件? 答案 新建一个空项目,修改Startup类并添加MVC服务和中间件: public void ConfigureServices(ISer ...

随机推荐

  1. Servlet第三篇【request和response简介、response的常见应用】

    response.request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象.和代表响应的response对象 既然request对象代表ht ...

  2. tomcat The specified JRE installation does not exist

    window->perferences->server->installed runtimes 里tomcat删掉,重新建立服务,再运行

  3. 由throw new Error() 引发的探讨

    问题复现 在工作时遇到了需要抛出异常并且需要自己捕获处理的地方,于是在抛出的地方写下 function parseExcel(con) { try { // doSomething } catch ( ...

  4. oracle pl/sql 函数

    函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句.而在函数体内必须包含return语句返回的数据.我们可以使用create function来建立函数. 1).接下来通过一个案 ...

  5. CentOS 7安装squid代理服务器

    Squid,一个高性能的代理缓存服务器,支持FTP.gopher.HTTP协议. Squid,一个缓存Internet 数据的软件,其接收用户的下载申请(作为代理服务器),并自动处理所下载的数据,并返 ...

  6. Linux入门之常用命令(9)进程及端口查看

    [Linux下查看进程] 查看程序对应进程号:ps –ef|grep 程序名 查看进程占用端口:ss -pl | grep 进程号 [通过进程查看端口] 查看占用的端口号:netstat –nltp| ...

  7. bzoj1806 [Ioi2007]Miners矿工配餐

    [bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...

  8. Nunit测试工具使用实例

    前言: 本文主要是介绍了Nunit的基本使用,其中参详了很多已有的文章,由于最近要使用其进行测试,所以对网上的文章做了下整理,同时加入了一些自己的实践. NUnit的属性 TestFixture 它标 ...

  9. ch3-模板语法({{}} v-html v-bind:id 表达式 指令 修饰符 过滤器)

    1 模板语法 Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据. 所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器 ...

  10. Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要

    1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...