首页 > 其他分享 >.NET Core的文件系统[3]:由PhysicalFileProvider构建的物理文件系统

.NET Core的文件系统[3]:由PhysicalFileProvider构建的物理文件系统

时间:2024-06-21 15:31:33浏览次数:3  
标签:Core 文件 对象 文件系统 PhysicalFileProvider PhysicalDirectoryInfo PhysicalFileInfo 物理

原文链接:https://blog.csdn.net/weixin_33795833/article/details/90324791

ASP.NET Core应用中使用得最多的还是具体的物理文件,比如配置文件、View文件以及网页上的静态文件,物理文件系统的抽象通过PhysicalFileProvider这个FileProvider来实现,该类型定义在NuGet包“Microsoft.Extensions.FileProviders.Physical”中。我们知道System.IO命名空间下定义了一整套针操作物理目录和文件的API,实际上PhysicalFileProvider最终也是通过调用这些API来完成相关的IO操作的。

一、PhysicalFileProvider

如下所示的代码片段展示PhysicalFileProvider类型的定义。

二、PhysicalFileInfo

一个PhysicalFileProvider对象总是映射到某个具体的物理目录下,被映射的目录所在的路径通过构造函数的参数root来提供,该目录将作为PhysicalFileProvider的根目录。GetFileInfo方法返回的FileInfo对象代表指定路径对应的文件,这是一个类型为PhysicalFileInfo的对象,如下所示的代码片段展示了该类型的完整定义。一个物理文件可以通过一个System.IO.FileInfo对象来表示,一个PhysicalFileInfo对象实际上就是对这个一个FileInfo对象的封装,定义在PhysicalFileInfo的所有属性都来源于这个FileInfo对象。对于创建读取文件输出流的CreateReadStream方法来说,它返回的是一个根据物理文件绝对路径创建的FileStream对象。

对于PhysicalFileProvider的GetFile方法来说,即使我们指定的路径指向一个具体的物理文件,它并不总是会返回一个PhysicalFileInfo对象。具体来说,PhysicalFileProvider会将如下几种场景视为“目标文件不存在”,并让GetFile返回一个NotFoundFileInfo对象。顾名思义,NotFoundFileInfo表示的正式一个“不存在”的文件,即它的Exists属性总是返回False,而其他的属性则变得没有任何意义。当我们调用它的CreateReadStream试图读取一个根本不存在的文件内容时,会抛出一个FileNotFoundException类型的异常。

  • 确实没有一个物理文件与指定的路径相匹配。
  • 如果指定的是一个绝对路径(比如“c:\foobar”),即Path.IsPathRooted返回返回True。
  • 如果指定的路径指向一个隐藏文件。

三、PhysicalDirectoryInfo

对于PhysicalFileProvider来说,它利用PhysicalFileInfo对象来描述某个具体的物理文件,针对目录的描述则通过一个类型为PhysicalDirectoryInfo的对象。既然PhysicalFileInfo是对一个System.IO.FileInfo对象的封装,那么我们应该想得到PhysicalDirectoryInfo封装的自然就是表示目录的DirectoryInfo对象。如下面的代码片段所示,我们需要在创建一个PhysicalDirectoryInfo对象时提供这个DirectoryInfo对象,PhysicalDirectoryInfo实现的所有属性的返回值都来源于这个DirectoryInfo对象。由于CreateReadStream方法的目的是读取文件的内容,所以当我们调用一个PhysicalDirectoryInfo对象的这个方法的时候,会抛出一个InvalidOperationException类型的异常。

标签:Core,文件,对象,文件系统,PhysicalFileProvider,PhysicalDirectoryInfo,PhysicalFileInfo,物理
From: https://www.cnblogs.com/Dongmy/p/18260617

相关文章

  • C# 之 .net core -- 创建项目
    原文链接:https://www.cnblogs.com/hkzw/p/12001420.html一、新建一个Web的应用程序 二、选择项目的基本信息(.netcoer2.2 和带有试图控制器的程序)在这里创建的是MVC模式,也可以用其他的,比如空的、web应用程序。跟平常开的的那种表面上差别不大,总之需要什么选什么 ......
  • ef core自定义默认的迁移表的名称
    efcore自定义默认的迁移表的名称usingMicrosoft.EntityFrameworkCore;usingMicrosoft.EntityFrameworkCore.Design;namespaceLong.EntityFrameworkCore;classMyDesignTimeDbContextFactory:IDesignTimeDbContextFactory<ApplicationDbContext>{publicApplicat......
  • .netcore 部署docker
    1.代码中新建一个dockerfile容器文件。下面是容器代码,9527是容器的端口。FROMmcr.microsoft.com/dotnet/aspnet:3.1ASbaseWORKDIR/appEXPOSE9527COPY..ENTRYPOINT["dotnet","myapidemo.dll"]2.代码中program.cs需要处理一下端口。 新建个json文......
  • api-ms-win-shcore-scaling-l1-1-1.dll解析及缺失解决策略:确保Windows高DPI显示正常
    api-ms-win-shcore-scaling-l1-1-1.dll是Windows操作系统中的一个API接口库文件,属于WindowsShellCommonDLLs(Shell核心动态链接库)的一部分。这个特定的DLL文件与Windows的高DPI(每英寸点数)缩放功能紧密相关,支持应用程序在不同分辨率和缩放设置下正确显示界面元素,确保UI的清晰......
  • .NET Core 3.x 基于AspectCore实现AOP,实现事务、缓存拦截器
    最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。这个也是网上说的面向切面编程AOP。AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码......
  • Microsoft.AspNetCore.Identity 的使用记录
    使用Cookie,在发起请求时从浏览器附加Cookie的示例图:请求后自动生成Cookie,缓存保存于浏览器中以后每次发起请求时浏览器都会自动为请求附加其缓存的Cookies使用访问令牌bearertoken,在发起请求时附加了Authorization请求头,示例注意,如果手动传参,Head中Authorizaion的值要......
  • 解决《模拟山羊》游戏启动问题:缺失wxmsw28u_core_vc_custom.dll的终极指南
    在沉浸于《模拟山羊》那荒诞不经、充满乐趣的游戏世界之前,你可能遭遇了一个小小的障碍——游戏启动时弹出错误提示,指出系统缺少一个名为“wxmsw28u_core_vc_custom.dll”的关键文件。别担心,这并非罕见问题,而且解决起来比你想象的要简单。本文将手把手教你如何跨越这个小障碍,确......
  • CorelDraw 2024软件安装包下载 丨不限速下载丨亲测好用
    ​简介:CorelDRAWGraphicsSuite订阅版拥有配备齐全的专业设计工具包,可以通过非常高的效率提供令人惊艳的矢量插图、布局、照片编辑和排版项目。价格实惠的订阅就能获得令人难以置信的持续价值,即时、有保障地获得独家的新功能和内容、一流的性能,以及对最新技术的支持。获得......
  • 最新.NET 8 中的 .NET Core 配置使用方法
    在这篇文章中,我将探讨.NET中配置的演变、框架如何处理配置,并提供实际示例来帮助你在应用程序中实现这些概念。什么是配置?.NET中的配置是指控制应用程序行为的设置。这些设置可以包括重试时间、队列长度、功能标志和机密(如连接字符串)等值。传统上,配置是在编译时应用的,但现......
  • Asp.net Core依赖注入(Autofac替换IOC容器)
    ASP.NETCoreASP.NETCore(previouslyASP.NET5)改变了以前依赖注入框架集成进ASP.NET的方法.以前,每个功能-MVC,WebAPI,等.-都有它自己的"依赖解析器(dependencyresolver)"机制并且只是'钩子'钩住的方式有些轻微的区别.ASP.NETCore通过Microsoft.Extensions.......