【.NET Core】深入理解IO之Path

简介: 【.NET Core】深入理解IO之Path

一、概述

文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据。 在 .NET 中,System.IO 命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。 这些命名空间还包含对文件执行压缩和解压缩的类型,以及通过管道和串行端口启用通信的类型。


二、Path详解

2.1 Path概述

路径是提供文件或目录位置的字符串。路径不一定指向磁盘上的位置。例如:路径可能映射到内存中或设备上的位置。路径的确切的格式由当前平台确定。在某些系统上,文件路径可以包含扩展,这些扩展指示存储在文件中的信息类型。文件扩展名的格式依赖于平台。当前平台还确定用于分隔路径元素的字符集,以及指定路径时无法使用的字符集。由于这些差异,类的Path字段以及类的某些成员Path的确切行为依赖于平台。


路径可以包含绝对或相对位置信息。 绝对路径完全指定位置:无论当前位置如何,都可以唯一标识文件或目录。 相对路径指定部分位置:定位使用相对路径指定的文件时,当前位置用作起点。如果要调用当前目录可以使用Directory.GetCurrentDirectory。


类的Path大多数成员不会与文件系统交互,并且不验证路径字符串指定的文件是否存在。Path修改路径字符串的类成员对文件系统中的文件名称没任何影响。


某些Path成员会验证指定路径字符串的内容,如果ArgumentException字符串包含路径字符串中无效的字符。


类的成员都是静态的Path,因此无需路径实例即可调用。Path在接受路径的成员中,路径可以引用文件或引用目录。指定的路径还可以引用服务器和共享名称的相对路径或通用命名约定(UNC)路径。


Path可接受的路径如下

  • C# 中的“c:\MyDir\MyFile.txt”
  • C# 中的“c:\MyDir”
  • C# 中的“MyDirMySubdir\”
  • C# 中的“\\MyServerMyShare\”

由于所有这些操作都在字符串上执行,因此无法验证结果在所有方案中是否有效。

2.2 Path属性

  • AltDirectorySeparatorChar

提供平台特定的替换字符,该替换字符用于在反映分层文件系统组织的路径字符串中分隔目录级别。

  • DirectorySeparatorChar

提供平台特定的字符,该字符用于在反映分层文件系统组织的路径字符串中分隔目录级别。

  • PathChars

用于在环境变量中分隔路径字符串的平台特定的分隔符

2.3 Path.ChangeExtension方法

Path.ChangeExtension(String, String)方法,用于更改路径字符串的扩展名。如果 和extension都不包含path句号(.),ChangeExtension则添加句点。参数extension可以包含多个句点和任何有效的路径字符,并且可以是任意长度。如果extension为null,则返回的字符串包含带有最后句点的内容Path,以及删除后的所有字符。


如果extension是空字符串,则返回的路径字符串包含path的内容,以及删除最后一个句点的任何字符。


如果 path 没有扩展名且 extension 不是 null,则返回的字符串包含 path 后 extension跟 。


如果 extension 不是 null 且不包含前导句点,则添加句点。如果 path 包含由多个句点分隔的多个扩展名,则返回的字符串将包含与最后一个句点以及它之后的所有字符替换为 extension的内容path

  • 示例
string goodFileName = @"C:\mydir\myfile.com.extension";
string badFileName = @"C:\mydir\";
string result;
result = Path.ChangeExtension(goodFileName, ".old");
Console.WriteLine("ChangeExtension({0}, '.old') returns '{1}'",goodFileName, result);

2.4 Path.Combine 方法

此方法旨在将单个字符串连接成表示文件路径的单个字符串。 但是,如果第一个参数以外的其他参数包含根路径,则忽略以前的任何路径组件,并且返回的字符串以该根路径组件开头。 作为方法的 Combine 替代方法,可以使用join


  • 重载
方法 说明
Combine(String[]) 将字符串数组组合成一个路径。
Combine(String,String) 将两个字符串组合成一个路径。
Combine(String,String,String) 将三个字符串组合成一个路径。
Combine(String,String,String,String) 将四个字符串组合成一个路径。
  • 示例
string[] paths = {@"d:\archives", "2001", "media", "images"};
string fullPath = Path.Combine(paths);
Console.WriteLine(fullPath);            

paths = new string[] {@"d:\archives\", @"2001\", "media", "images"};
fullPath = Path.Combine(paths);
Console.WriteLine(fullPath); 

2.5 Path.GetDirectoryName 方法

返回指定路径的目录信息。在大多数的情况下,此方法返回的字符串由路径中所有字符组成,但不包含最后一个目录的分隔符()。目录分隔符可以是DirectorySeparatorChar或AltDirectorySeparatorChar。如果路径由根目录组成,返回为null。此方法不支持使用file:的路径。由于返回的路径不包含最后一个目录分隔符()。因此将返回路径传递回GetDirectoryName方法会截断每次对结果路径进行后续调用时,将截断一个文件夹级别。

  • 重载
方法 说明
GetDirectoryName(String) 返回指定路径的目录信息。
GetDirectoryName(ReadOnlySpan) 返回由字符范围表示的指定路径的目录信息。
  • 示例
string filePath = @"C:\MyDir\MySubDir\myfile.ext";
string directoryName;
int i = 0;
directoryName = Path.GetDirectoryName(filePath);
Console.WriteLine($"GetDirectoryName-{directoryName}");

2.6 Path.GetExtension 方法

此方法通过搜索path句点 (“获取 的path扩展。) ,从只读范围中的最后一个字符开始,一直到第一个字符。 如果在 或 字符之前DirectorySeparatorChar找到句点,则返回的只读范围包含句点和其后的字符;否则返回 ReadOnlySpan.Empty。

  • 重载
方法 说明
GetExtension(ReadOnlySpan) 返回由只读字符范围表示的文件路径的扩展名
GetExtension(String) 返回指定路径字符串的扩展名(包括句点“.”)
  • 示例
string fileName = @"C:\mydir.old\myfile.ext";
string path = @"C:\mydir.old\";
string extension;
extension = Path.GetExtension(fileName);
Console.WriteLine("GetExtension('{0}') returns '{1}'",fileName, extension);

2.7 Path.GetFileName 方法

返回的只读范围包含 中最后一个分隔符后面的路径的 path字符。 如果 中的 path 最后一个字符是卷分隔符或目录分隔符,则该方法返回 ReadOnlySpan.Empty

  • 重载
方法 说明
GetFileName(ReadOnlySpan) 返回由只读字符范围表示的文件路径的文件名和扩展名。
GetFileName(String) 返回指定路径字符串的文件名和扩展名
  • 示例
string fileName = @"C:\mydir\myfile.ext";
string path = @"C:\mydir\";
string result;
result = Path.GetFileName(fileName);
Console.WriteLine("GetFileName-{fileName} returns {result}");

2.8 Path.GetPathRoot 方法

此方法不验证路径或文件是否存在。


此方法将规范化目录分隔符。


如果为,字符串为“实际上为空”::


  • 在 Windows 中,对此字符串调用 IsEmpty 将返回 true,或者其所有字符都是空格 (“) 。
  • 在 Unix 中,对此字符串调用 IsNullOrEmpty 将 true返回 。

此方法返回的字符串的可能模式如下所示:

  • null``path (为 null 或) 为空字符串。


  • 空字符串 (path 指定当前驱动器或卷) 上的相对路径。


  • “/” (Unix: path 指定当前驱动器上的绝对路径) 。


  • “X:” (Windows: path 指定驱动器上的相对路径,其中 X 表示驱动器或卷号) 。


  • “X:\” (Windows: path 指定给定驱动器上的绝对路径) 。


  • Windows (“\ComputerName\SharedFolder”:) UNC 路径。


  • “\?\C:” (Windows:一个 DOS 设备路径,在 .NET Core 1.1 及更高版本中受支持,.NET Framework 4.6.2 及更高版本) 。
  • 重载
方法 说明
GetPathRoot(String) 从指定字符串包含的路径中获取根目录信息。
GetPathRoot(ReadOnlySpan) 从指定字符范围包含的路径中获取根目录信息。
  • 示例
string path = @"\mydir\";
string fileName = "myfile.ext";
string fullPath = @"C:\mydir\myfile.ext";
string pathRoot;
pathRoot = Path.GetPathRoot(path);
Console.WriteLine($"GetPathRoot{path} returns {pathRoot}");
pathRoot = Path.GetPathRoot(fileName);
Console.WriteLine($"GetPathRoot{fileName} returns{pathRoot}");

2.9 Path.Join 方法

此方法只是连接pathpath2path3并在任何路径组件之间添加目录分隔符(如果尚不存在)。如果 path1path2path3 以不适合目标平台的路径分隔符结尾,该方法 Join 将保留原始路径分隔符并追加受支持的字符。


  • Combine与Join异同

Join方法不会尝试对返回的路径进行跟目录。是绝对路径。则Join该方法不会像Combine方法那样丢弃以前的路径。

  • 重载
方法 说明
Join(String,String,String,String) 将四个路径连接到一个路径中。
Join(ReadOnlySpan,ReadOnlySpan) 将三个路径组件连接到一个路径中。
Join(String) 将路径数组连接到一个路径中。
Join(String[]) 将路径数组连接到一个路径中。
  • 示例
var path1 = "C:/Program Files/";
var path2 = "Utilities/SystemUtilities";
var result = Path.Join(path1, path2);
Console.WriteLine($"   Path.Combine:  '{result}'");

三、总结

Path在文件上传及处理文件的时候特别好用。在实际使用中根据场景来选择对应的方法。

目录
相关文章
|
6天前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
6天前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
18 3
|
28天前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
2月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
35 0
|
2月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
63 0
|
2月前
|
开发框架 监控 .NET
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
|
2月前
|
Linux C# C++
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
|
2月前
|
开发框架 .NET API
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?
|
2月前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
|
2月前
|
开发框架 中间件 .NET
聊聊 ASP.NET Core 中间件(三):如何创建自己的中间件?
聊聊 ASP.NET Core 中间件(三):如何创建自己的中间件?
下一篇
无影云桌面