ASP.NET Core File Providers
2016-12-08 07:41
483 查看
ASP.NET Core通过对File Providers的使用实现了对文件系统访问的抽象。
查看或下载示例代码
要创建一个
为了在控制器中请求一个provider,需要在控制器的构造函数中指定类型参数并赋值给本地属性。之后你就可以在你的动作器方法中使用本地实例了。
在应用的
在 Index.chhtml 视图中,可以遍历操作
结果如下:
当你把文件嵌入到程序集中时,你可以使用通配符模式。这些模式可以被用来匹配一个或多个文件。
Note
把项目中所有的.js文件都嵌入到项目程序集里的情况是不太可能发生的,以上示例仅作为demo给出。
当创建一个
以上的代码片段描述了如何创建一个能访问当前工作程序集的
使用
Note
如上图所示,嵌入式资源不会公开目录。相反的,资源路径(经由资源的命名空间)会被嵌入到它的文件名中并以
Tip
使用包含物理式provider(在前)和嵌入式provider的
在这个文章的示例中,无论何时当文本文件内容发生修改,按如下代码配置的console应用都会显示相应的信息。
以下是执行过几次文本保存动作后的运行结果截图:
Note
有一些文件系统,例如Docker容器和网络共享,可能不能很可靠地发送更改通知。设置环境变量
在指定的文件夹中匹配指定的文件。
在指定的文件夹中匹配所有以
在指定的
在指定的
原文地址:http://www.cnblogs.com/Wddpct/p/6128386.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
查看或下载示例代码
File Provider 抽象
File Providers是文件系统之上的一层抽象。它的主要接口是IFileProvider。
IFileProvider公开了相应方法用来获取文件信息(
IFileInfo), 目录信息(
IDirectoryContents),以及设置更改通知(通过使用一个
IChangeToken)。
IFileInfo接口提供了操作单个文件和目录的方法和属性。它有两个
boolean属性,
Exists和
IsDirectory,以及两个描述文件的两个属性
Name和
Length(按字节),还包括一个
LastModified日期属性。你还可以通过
CreateReadStream方法读取文件内容。
File Provider 实现
有三种对于IFileProvider的实现可供选择:物理式,嵌入式和复合式。物理式用于访问实际系统中的文件。嵌入式用于访问嵌入在程序集中的文件。 复合式则是对前两种方式的组合使用。
PhysicalFileProvider
PhysicalFileProvider提供了对物理文件系统的访问。它封装了
System.IO.File类型,范围限定到一个目录及其子目录的所有路径。这类作用域会限制访问某个目录及其子目录,防止作用域以外的其他操作访问文件系统。当实例化此类provider时,你必须为它提供一个目录路径,以供服务器拿来当做由这个provider发出的所有请求的基础路径(这个provider会限制路径以外的访问请求)。在一个ASP.NET Core应用,你可以直接实例化出一个
PhysicalFileProviderprovider,或者你也可以通过在控制器和服务中使用构造函数依赖注入的方式,请求一个
IFileProvider接口。后者生成的解决方案通常更灵活以及更便于测试。
要创建一个
PhysicalFileProvider其实很简单,只需要对其实化,再传递给它一个物理路径。之后你就可以通过它的目录遍历内容或提供子路径获取特定文件的信息。
IFileProvider provider = new PhysicalFileProvider(applicationRoot); IDirectoryContents contents = provider.GetDirectoryContents(""); // the applicationRoot contentsIFileInfo fileInfo = provider.GetFileInfo("wwwroot/js/site.js"); // a file under applicationRoot
为了在控制器中请求一个provider,需要在控制器的构造函数中指定类型参数并赋值给本地属性。之后你就可以在你的动作器方法中使用本地实例了。
public class HomeController : Controller{ private readonly IFileProvider _fileProvider; public HomeController(IFileProvider fileProvider) { _fileProvider = fileProvider; } public IActionResult Index() { var contents = _fileProvider.GetDirectoryContents(""); return View(contents); } }
在应用的
Startup类中创建provider的代码如下:
using System.Linq; using System.Reflection; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; namespace FileProviderSample{ public class Startup { private IHostingEnvironment _hostingEnvironment; public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); _hostingEnvironment = env; } public IConfigurationRoot Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); var physicalProvider = _hostingEnvironment.ContentRootFileProvider; var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly()); var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider); // choose one provider to use for the app and register it //services.AddSingleton<IFileProvider>(physicalProvider); //services.AddSingleton<IFileProvider>(embeddedProvider); services.AddSingleton<IFileProvider>(compositeProvider); } } }
在 Index.chhtml 视图中,可以遍历操作
IDirectoryContents模型参数
@using Microsoft.Extensions.FileProviders @model IDirectoryContents<h2>Folder Contents</h2><ul> @foreach (IFileInfo item in Model) { if (item.IsDirectory) { <li><strong>@item.Name</strong></li> } else { <li>@item.Name - @item.Length bytes</li> } }</ul>
结果如下:
EmbeddedFileProvider
EmbeddedFileProvider用于访问嵌入到程序集中的文件。在.NET Core中,你可以通过修改 project.json 文件的
buildOptions属性参数来把文件嵌入到程序集中。
"buildOptions": { "emitEntryPoint": true, "preserveCompilationContext": true, "embed": [ "Resource.txt", "**/*.js" ] }
当你把文件嵌入到程序集中时,你可以使用通配符模式。这些模式可以被用来匹配一个或多个文件。
Note
把项目中所有的.js文件都嵌入到项目程序集里的情况是不太可能发生的,以上示例仅作为demo给出。
当创建一个
EmbeddedFileProvider时,请在其构造函数中传入一个程序集实例供其读取。
var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());
以上的代码片段描述了如何创建一个能访问当前工作程序集的
EmbeddedFileProvider类型变量。
使用
EmbeddedFileProvider更新示例项目代码后的输出结果如下:
Note
如上图所示,嵌入式资源不会公开目录。相反的,资源路径(经由资源的命名空间)会被嵌入到它的文件名中并以
.作为分隔符。
Tip
EmbeddedFileProvider构造器接受一个可选的
baseNamespace参数,指定此参数将限定
GetDirectoryContents方法调用该命名空间下的资源。
CompositeFileProvider
CompositeFileProvider联合
IFileProvider实例公开了一个单一的接口,用以和来自多种provider的文件工作。当创建一个
CompositeFileProvider时,你可以为它的构造函数传入一个或多
个IFileProvider实例。
var physicalProvider = _hostingEnvironment.ContentRootFileProvider;var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly());var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider);
使用包含物理式provider(在前)和嵌入式provider的
CompositeFileProvider更新示例项目代码后的输出结果如下:
查看更改
IFileProvider的
Watch方法能用来查看一个或多个文件/目录的更改信息。
Watch方法接受一个路径字符串,它也可以使用通配符模式来指定多个文件,
Watch方法最终返回一个
IChangeToken。这个token公开了一个
HasChanged属性用以检视状态,公开了一个
RegisterChangeCallback方法,此方法会在指定的路径字符串检测到更改时被调用。请注意每个更改token只调用其关联回调以响应单次更改。为了使监控持续,你可以使用如下所示的
TaskCompletionSource方法,或者重建
IChangeToken以响应更改。
在这个文章的示例中,无论何时当文本文件内容发生修改,按如下代码配置的console应用都会显示相应的信息。
using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Primitives; namespace WatchConsole{ public class Program { private static PhysicalFileProvider _fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()); public static void Main(string[] args) { Console.WriteLine("Monitoring quotes.txt for changes (ctrl-c to quit)..."); while (true) { MainAsync().GetAwaiter().GetResult(); } } private static async Task MainAsync() { IChangeToken token = _fileProvider.Watch("quotes.txt"); var tcs = new TaskCompletionSource<object>(); token.RegisterChangeCallback(state => ((TaskCompletionSource<object>)state).TrySetResult(null), tcs); await tcs.Task.ConfigureAwait(false); Console.WriteLine("quotes.txt changed"); } } }
以下是执行过几次文本保存动作后的运行结果截图:
Note
有一些文件系统,例如Docker容器和网络共享,可能不能很可靠地发送更改通知。设置环境变量
DOTNET_USE_POLLINGFILEWATCHER的值为
1或
true,使得每四秒轮询一次文件系统的变更。
通配符模式
文件系统路径规则使用叫作globbing patterns的通配符模式,这类简单模式可以被用来指定文件组。这两个通配符分别是*和
**。
*
*表示在当前文件夹级别上匹配任何文件名称或文件扩展名。匹配以文件路径字符串中的
/和
.符号结尾。
**
**表示在多个目录级别上匹配任何文件名称或文件扩展名。可用于在一个目录层次结构中递归地匹配多个文件。
通配符模式示例
directory/file.txt
在指定的文件夹中匹配指定的文件。
directory/*.txt
在指定的文件夹中匹配所有以
.txt扩展名结尾的文件。
directory/*/project.json
在指定的
directory文件夹下的一级目录位置中匹配所有符合
project.json名称的文件
directory/**/*.txt
在指定的
directory文件夹下的所有位置中匹配所有以
.txt扩展名结尾的文件。
在ASP.NET Core中File Provider的用法
ASP.NET Core有几个组件使用file provider功能。IHostingEnvironment以
IFileProvider接口类型公开了应用的目录根和Web根。静态文件中间件使用file provider来定位静态文件。Razor更是大量使用
IFileProvider来定位视图。Dotnet的发布功能使用file provider和通配符模式来指定需要跟随发布的文件。
在应用程序中使用的建议
如果你的ASP.NET Core应用需要访问文件系统,你可以通过依赖注入创建IFileProvider接口实例,然后再通过前文所示的相应方法执行访问。当应用启动的时候,这些方法允许你一次性配置provider并减少应用初始化时生成的实例类型数目。
原文地址:http://www.cnblogs.com/Wddpct/p/6128386.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
相关文章推荐
- ASP.NET Core File Providers
- ASP.NET Core 源码学习之 Logging[4]:FileProvider
- ASP.NET CORE做的网站运行在docker上(不用dockerfile文件部署)
- [ASP.NET Core] Static File Middleware
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- ASP.NET CORE做的网站运行在docker上(不用dockerfile文件部署)
- [ASP.NET Core] Static File Middleware
- [转]File uploads in ASP.NET Core
- ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
- Microsoft ASP.NET 2.0 Providers: Introduction
- ASP.NET 2.0之HtmlInputFile控件使用小结
- asp.net 通过HtmlInputFile控件上传文件的类
- asp.net 通过HtmlInputFile控件上传文件的类
- Always set the "applicationName" property when configuring ASP.NET 2.0 Membership and other Providers
- File Uploading in ASP.NET Using C#
- Saving and Displaying Photos in SQL Server using ASP.NET and FileUpload Control
- Managing Your ASP.NET Application[1]->Configuration File Format
- HTML Controls->ASP.NET HtmlInputFile Control
- 如何在ASP.NET里用HtmlInputFile控件来上载文件。
- Access Providers for Asp.net 2005