问题
如何在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 本地文件操作的更多相关文章
-
[译]ASP.NET Core 2.0 系列文章目录
基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...
-
ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介
概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...
-
[译]ASP.NET Core 2.0 全局配置项
问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...
-
[译]ASP.NET Core 2.0 机密配置项
问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...
-
[译]ASP.NET Core 2.0 网址重定向
问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter) ...
-
[译]ASP.NET Core 2.0 路由引擎之网址生成
问题 如何在ASP.NET Core 2.0中由路由引擎来生成网址? 答案 新建一个空项目,修改Startup.cs文件,添加MVC服务和中间件: public void ConfigureServi ...
-
[译]ASP.NET Core 2.0 视图引擎
问题 如何在ASP.NET Core 2.0中使用Razor引擎来创建视图? 答案 新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件: public void ConfigureS ...
-
[译]ASP.NET Core 2.0 布局页面
问题 如何在ASP.NET Core 2.0项目*享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public int ...
-
[译]ASP.NET Core 2.0 视图组件
问题 如何在ASP.NET Core 2.0中使用视图组件? 答案 新建一个空项目,修改Startup类并添加MVC服务和中间件: public void ConfigureServices(ISer ...
随机推荐
-
[linux]解决vsftpd 读取目录列表失败的问题
使用第三方FTP软件filezilla进行登陆,出现如下错误:状态: 正在连接 192.168.1.6:21...状态: 连接建立,等待欢迎消息...响应: 220 (vsFTPd ...
-
ckeditor 升级到 4.5
原来的项目用的是4.0+asp.net 3.5的,一直不错,这两天升级一下ckeditor到最新版4.5.1,用的是chrome浏览器测试,发觉TextBox.Text获取不到数据,在页面用js写do ...
-
Course Schedule II 解答
Question There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may ...
-
Web 项目系列之浏览器机制(一)
目录: ——初步认识浏览器 ——浏览器的渲染机制 ——浏览器的缓存机制 正文: 初步认识浏览器 想来任何一位读者,对浏览器都不会陌生.除开IT相关人员常用的Chrome(谷歌,Google).Fi ...
- noip第25课资料
-
springbooot2 thymeleaf 配置以及加载资源文件。Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
最近在学习springbooot2 和 thymeleaf 程序文件 application.properties文件配置: #thymeleaf spring.thymeleaf.prefix=cl ...
-
Python全局解释器锁 -- GIL
首先强调背景: 1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能 ...
-
Ubuntu 14.04 安装 DevStack与遇到的的问题记录
本文总结Ubuntu 14.04下部署DevStack的过程以及一些可能遇到的问题. 一.安装 以下的操作最好在普通用户下进行,至少在git clone devstack的时候使用普通用户,这样可以避 ...
-
CodeForces - 197D
开场连wa三发A题,差点心态崩了,还好坚持打完了,一共A了三题 A题,判断能不能放第一个圆,能放的话,先手比赢 #include<map> #include<set> #inc ...
-
Android系统自带样式
android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式 android:theme="@andr ...