问题

如何在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. Shiro第二篇【介绍Shiro、认证流程、自定义realm、自定义realm支持md5】

    什么是Shiro shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证.用户授权. spring中有spring security (原名Acegi),是一个权限框架,它和sp ...

  2. java.io.IOException: Stream closed

    今天在做SSH项目的时候,出现了这个错误.百思不得其解,网上的答案都不能解决我的问题-.. 后来,一气之下就重新写,写了之后发现在JSP遍历集合的时候出错了. <s:iterator value ...

  3. 解决Maven管理的项目下"Missing artifact xxx bundle"问题

    例如使用maven编译使用了mina的包的工程,出现如下提示:  [INFO] Scanning for projects... [INFO]                             ...

  4. java web项目修改favicon.ico图标的方式

    1.修改整个项目的tomcat图标 找到tomcat的根目录(tomcat-webapps-ROOT目录),然后将修改的favicon.ico图标覆盖掉本地的图标,然后再重启项目,刷新,清除浏览器缓存 ...

  5. Linux 下安装maven

    1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令:2.进入下载文件夹,找到下载的文件,运行 ...

  6. 自学Unity3D 之 贪吃蛇 添加摄像机跟随

    在Unity的世界中, 物体的位置都是由向量构成的. 今天所需要做的就是让摄像机保持跟蛇头的相对距离. 首先  设蛇头的位置在A 点  , 摄像机的位置在B 点 则  我们可以知道  他们的offse ...

  7. 关于sping quartz定时执行理解与思考

    转载请注明原创出处,谢谢! 一直以为自己理解spring quartz,忽然最近几天发现自己理解的不对,在4月18号的时候,我执行了一个spring quartz的计划如下: 1 0 0 */3 * ...

  8. Linux 内核模块程序结构

    1.内核加载函数 即我们常说的内核入口函数,当内核被加载的时候调用,在内核入口函数中多进行设备的注册和初始化,其中最常用的莫过于module_init().insmod xxx.ko的时候调用. 通常 ...

  9. HTTP协议报文、工作原理

    一.web及网络基础       1.HTTP的历史            1.1.HTTP的概念:                 HTTP(Hyper Text Transfer Protocol ...

  10. ThinkPHP中foreach和volist的区别

    1.foreach标签foreach标签用于循环输出:foreach(name,item,key)name(必须):要输出的数据模板变量item(必须):循环单原变量key(可选):循环的key变量, ...