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

一、概述

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

【.Net Core】深入理解IO之文件和目录【.NET Core】深入理解IO之File类已详细讲解了对目录的操作和对文件操作,下面我们将讲解IO中的一个重要类Path的应用。

二、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,则返回的字符串包含 pathextension跟 。

如果 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

  • 重载
  • 示例
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 方法

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

  • 重载
  • 示例
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

  • 重载
  • 示例
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

  • 重载
  • 示例
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 及更高版本) 。

  • 重载

  • 示例
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方法那样丢弃以前的路径。

  • 重载
  • 示例
var path1 = "C:/Program Files/";
var path2 = "Utilities/SystemUtilities";
var result = Path.Join(path1, path2);
Console.WriteLine($"   Path.Combine:  '{result}'");

三、总结

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

03-04 02:12