🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。
🐬个人主页:会敲键盘的肘子
🐰系列专栏:.Net实用方法总结
🦀专栏简介:博主针对.Net开发和C站问答过程中遇到的问题进行总结,形成本专栏,希望可以帮助到您解决问题。
🐶座右铭:总有一天你所坚持的会反过来拥抱你。
🌈写在前面:
本文主要介绍System.IO命名空间的Path类,介绍其常用的方法和实践。
👉本文关键字:System.IO、Path类、文件或目录路径信息、方法实践、C#
文章目录
- 1️⃣ System.IO命名空间
- 2️⃣ Path类
- ♈ 定义
- ♉ 常用方法
- ChangeExtension(String, String) 更改路径字符串的扩展名
- Combine(String[]) 将字符串数组组合成一个路径
- GetFileName(String) 返回指定路径字符串的文件名和扩展名。
- GetFileNameWithoutExtension(String) 返回不具有扩展名的指定路径字符串的文件名
- GetFullPath(String) 返回指定路径字符串的绝对路径
- GetFullPath(String, String) 从完全限定的基路径和相对路径返回绝对路径
- GetDirectoryName(String) 返回指定路径的目录信息
- GetExtension(String) 返回指定路径字符串的扩展名(包括句点“.”)
- GetPathRoot(String) 从指定字符串包含的路径中获取根目录信息
- HasExtension(String) 确定路径是否包括文件扩展名
- IsPathRooted(String) 返回一个值,该值指示指定的路径字符串是否包含根
- Join(String[]) 将路径数组连接到一个路径中
- ♊ 注解
- ♋ 更多方法
1️⃣ System.IO命名空间
.NET中的IO操作命名空间,包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。
我们在.NET中的IO操作,经常需要调用一下几个类。
- FileStream类
文件流类,负责大文件的拷贝,读写。
- Path类
Path类中方法,基本都是对字符串(文件名)的操作,与实际文件没多大关系。
-
File类
File类可以进行一些对小文件拷贝、剪切操作,还能读一些文档文件。
-
Dirctory
目录操作,创建文件、删除目录,获取目录下文件名等等。
2️⃣ Path类
♈ 定义
对包含文件或目录路径信息的 String 实例执行操作。 这些操作是以跨平台的方式执行的。
public static class Path
♉ 常用方法
ChangeExtension(String, String) 更改路径字符串的扩展名
public static string? ChangeExtension (string? path, string? extension);
参数
path
string
要修改的路径信息。
string
extension
新的扩展名(有或没有前导句点)。 指定
null
以从path
移除现有扩展名。
返回
已修改的路径信息。
在基于 Windows 的桌面平台上,如果
path
是null
或空字符串 (“”),则返回的路径信息是未修改的。 如果extension
为null
,则返回的字符串包含指定的路径(其扩展名已移除)。 如果path
不具有扩展名且extension
不为null
,则返回的路径字符串包含追加到path
结尾的extension
。
示例
public void ChangeExtension()
{
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);
result = Path.ChangeExtension(goodFileName, "");
Console.WriteLine("ChangeExtension({0}, '') returns '{1}'",
goodFileName, result);
result = Path.ChangeExtension(badFileName, ".old");
Console.WriteLine("ChangeExtension({0}, '.old') returns '{1}'",
badFileName, result);
// This code produces output similar to the following:
//
// ChangeExtension(C:\mydir\myfile.com.extension, '.old') returns 'C:\mydir\myfile.com.old'
// ChangeExtension(C:\mydir\myfile.com.extension, '') returns 'C:\mydir\myfile.com.'
// ChangeExtension(C:\mydir\, '.old') returns 'C:\mydir\.old'
}
Combine(String[]) 将字符串数组组合成一个路径
注:
Combine(String, String)
、Combine(String, String, String)
、Combine(String, String, String, String)
类似
public static string Combine (params string[] paths);
参数
path
string[]
由路径的各部分构成的数组。
返回
string
已组合的路径。
示例
string[] paths = {@"d:\archives", "2001", "media", "images"};
string fullPath = Path.Combine(paths);
Console.WriteLine(fullPath);
GetFileName(String) 返回指定路径字符串的文件名和扩展名。
public static string? GetFileName (string? path);
参数
path
string
从中获取文件名和扩展名的路径字符串。
返回
string
path
中最后的目录分隔符后的字符。 如果path
的最后一个字符是目录或卷分隔符,则此方法返回 Empty。 如果path
为null
,则此方法返回null
。
示例
string fileName = @"C:\mydir\myfile.ext";
string path = @"C:\mydir\";
string result;
result = Path.GetFileName(fileName);
Console.WriteLine("GetFileName('{0}') returns '{1}'",
fileName, result);
result = Path.GetFileName(path);
Console.WriteLine("GetFileName('{0}') returns '{1}'",
path, result);
// This code produces output similar to the following:
//
// GetFileName('C:\mydir\myfile.ext') returns 'myfile.ext'
// GetFileName('C:\mydir\') returns ''
GetFileNameWithoutExtension(String) 返回不具有扩展名的指定路径字符串的文件名
public static string? GetFileNameWithoutExtension (string? path);
参数
path
string
文件的路径。
返回
string
path
中最后的目录分隔符后的字符,不包括最后的句点 (.) 以及之后的所有字符。
示例
string fileName = @"C:\mydir\myfile.ext";
string path = @"C:\mydir\";
string result;
result = Path.GetFileNameWithoutExtension(fileName);
Console.WriteLine("GetFileNameWithoutExtension('{0}') returns '{1}'",
fileName, result);
result = Path.GetFileName(path);
Console.WriteLine("GetFileName('{0}') returns '{1}'",
path, result);
// This code produces output similar to the following:
//
// GetFileNameWithoutExtension('C:\mydir\myfile.ext') returns 'myfile'
// GetFileName('C:\mydir\') returns ''
GetFullPath(String) 返回指定路径字符串的绝对路径
public static string GetFullPath (string path);
参数
path
string
要获取其绝对路径信息的文件或目录。
返回
string
完全限定的位置
path
,例如“C:\MyFile.txt”。
示例
string fileName = "myfile.ext";
string path1 = @"mydir";
string path2 = @"\mydir";
string fullPath;
fullPath = Path.GetFullPath(path1);
Console.WriteLine("GetFullPath('{0}') returns '{1}'",
path1, fullPath);
fullPath = Path.GetFullPath(fileName);
Console.WriteLine("GetFullPath('{0}') returns '{1}'",
fileName, fullPath);
fullPath = Path.GetFullPath(path2);
Console.WriteLine("GetFullPath('{0}') returns '{1}'",
path2, fullPath);
// Output is based on your current directory, except
// in the last case, where it is based on the root drive
// GetFullPath('mydir') returns 'C:\temp\Demo\mydir'
// GetFullPath('myfile.ext') returns 'C:\temp\Demo\myfile.ext'
// GetFullPath('\mydir') returns 'C:\mydir'
补充
如果
path
为相对路径,此重载将返回完全限定的路径,该路径可以基于当前驱动器和当前目录。 应用程序执行时,当前驱动器和当前目录可以随时更改。 因此,无法提前确定此重载返回的路径。 若要返回确定性路径,请调用 GetFullPath(String, String) 重载。 还可以调用 IsPathFullyQualified 该方法来确定路径是完全限定还是相对路径,因此是否需要调用GetFullPath
。
GetFullPath(String, String) 从完全限定的基路径和相对路径返回绝对路径
public static string GetFullPath (string path, string basePath);
参数
path
string
连接到
basePath
的相对路径。
basePath
string
完全限定路径的开头。
返回
string
绝对路径。
示例
using System;
using System.IO;
class Program
{
static void Main()
{
string basePath = Environment.CurrentDirectory;
string relativePath = "./data/output.xml";
// Unexpectedly change the current directory.
Environment.CurrentDirectory = "C:/Users/Public/Documents/";
string fullPath = Path.GetFullPath(relativePath, basePath);
Console.WriteLine($"Current directory:\n {Environment.CurrentDirectory}");
Console.WriteLine($"Fully qualified path:\n {fullPath}");
}
}
// The example displays the following output:
// Current directory:
// C:\Users\Public\Documents
// Fully qualified path:
// C:\Utilities\data\output.xml
GetDirectoryName(String) 返回指定路径的目录信息
public static string? GetDirectoryName (string? path);
参数
path
string
文件或目录的路径。
返回
string
path
的目录信息;如果path
表示根目录或为 null,则为null
。 如果path
不包含目录信息,则返回 Empty。
示例
string filePath = @"C:\MyDir\MySubDir\myfile.ext";
string directoryName;
int i = 0;
while (filePath != null)
{
directoryName = Path.GetDirectoryName(filePath);
Console.WriteLine("GetDirectoryName('{0}') returns '{1}'",
filePath, directoryName);
filePath = directoryName;
if (i == 1)
{
filePath = directoryName + @"\"; // this will preserve the previous path
}
i++;
}
/*
This code produces the following output:
GetDirectoryName('C:\MyDir\MySubDir\myfile.ext') returns 'C:\MyDir\MySubDir'
GetDirectoryName('C:\MyDir\MySubDir') returns 'C:\MyDir'
GetDirectoryName('C:\MyDir\') returns 'C:\MyDir'
GetDirectoryName('C:\MyDir') returns 'C:\'
GetDirectoryName('C:\') returns ''
*/
GetExtension(String) 返回指定路径字符串的扩展名(包括句点“.”)
public static string? GetExtension (string? path);
参数
path
string
从中获取扩展名的路径字符串。
返回
string
指定路径的扩展名(包含句点“.”)、或
null
、或 Empty。 如果path
为null
,则 GetExtension(String) 返回null
。 如果path
不具有扩展名信息,则 GetExtension(String) 返回 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);
extension = Path.GetExtension(path);
Console.WriteLine("GetExtension('{0}') returns '{1}'",
path, extension);
// This code produces output similar to the following:
//
// GetExtension('C:\mydir.old\myfile.ext') returns '.ext'
// GetExtension('C:\mydir.old\') returns ''
GetPathRoot(String) 从指定字符串包含的路径中获取根目录信息
public static string? GetPathRoot (string? path);
参数
path
string
一个字符串,包含要从中获取根目录信息的路径。
返回
string
如果为根路径,则为
path
的根目录。
- 或 - 如果
path
不包含根目录信息,则为 Empty。- 或 - 如果
path
为null
或实际上为空,则为null
。
示例
string path = @"\mydir\";
string fileName = "myfile.ext";
string fullPath = @"C:\mydir\myfile.ext";
string pathRoot;
pathRoot = Path.GetPathRoot(path);
Console.WriteLine("GetPathRoot('{0}') returns '{1}'",
path, pathRoot);
pathRoot = Path.GetPathRoot(fileName);
Console.WriteLine("GetPathRoot('{0}') returns '{1}'",
fileName, pathRoot);
pathRoot = Path.GetPathRoot(fullPath);
Console.WriteLine("GetPathRoot('{0}') returns '{1}'",
fullPath, pathRoot);
// This code produces output similar to the following:
//
// GetPathRoot('\mydir\') returns '\'
// GetPathRoot('myfile.ext') returns ''
// GetPathRoot('C:\mydir\myfile.ext') returns 'C:\'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);
extension = Path.GetExtension(path);
Console.WriteLine("GetExtension('{0}') returns '{1}'",
path, extension);
// This code produces output similar to the following:
//
// GetExtension('C:\mydir.old\myfile.ext') returns '.ext'
// GetExtension('C:\mydir.old\') returns ''
HasExtension(String) 确定路径是否包括文件扩展名
public static bool HasExtension (string? path);
参数
path
string
用于搜索扩展名的路径。
返回
bool
true
如果路径中最后一个目录分隔符后面的字符 (\ 或 /) 或卷分隔符 (:) 包含句点 (.) 后跟一个或多个字符,则为 ;否则为false
。
示例
string fileName1 = "myfile.ext";
string fileName2 = @"mydir\myfile";
string path = @"C:\mydir.ext\";
bool result;
result = Path.HasExtension(fileName1);
Console.WriteLine("HasExtension('{0}') returns {1}",
fileName1, result);
result = Path.HasExtension(fileName2);
Console.WriteLine("HasExtension('{0}') returns {1}",
fileName2, result);
result = Path.HasExtension(path);
Console.WriteLine("HasExtension('{0}') returns {1}",
path, result);
// This code produces output similar to the following:
//
// HasExtension('myfile.ext') returns True
// HasExtension('mydir\myfile') returns False
// HasExtension('C:\mydir.ext\') returns False
IsPathRooted(String) 返回一个值,该值指示指定的路径字符串是否包含根
public static bool IsPathRooted (string? path);
参数
path
string
要测试的路径。
返回
bool
如果
path
包含一个根,则为true
;否则为false
。
示例
string fileName = @"C:\mydir\myfile.ext";
string UncPath = @"\\myPc\mydir\myfile";
string relativePath = @"mydir\sudir\";
bool result;
result = Path.IsPathRooted(fileName);
Console.WriteLine("IsPathRooted('{0}') returns {1}",
fileName, result);
result = Path.IsPathRooted(UncPath);
Console.WriteLine("IsPathRooted('{0}') returns {1}",
UncPath, result);
result = Path.IsPathRooted(relativePath);
Console.WriteLine("IsPathRooted('{0}') returns {1}",
relativePath, result);
// This code produces output similar to the following:
//
// IsPathRooted('C:\mydir\myfile.ext') returns True
// IsPathRooted('\\myPc\mydir\myfile') returns True
// IsPathRooted('mydir\sudir\') returns False
Join(String[]) 将路径数组连接到一个路径中
public static bool IsPathRooted (string? path);
参数
path
string[]
路径的数组。
返回
bool
连接的路径。
补充
Combine与该方法不同,该方法Join不会尝试对返回的路径进行根目录。 (也就是说,如果除最后一个路径之外的任何路径
paths
是绝对路径,该方法Join
不会像该方法那样 Combine 放弃以前的路径。
示例
using System;
using System.IO;
class Program2
{
static void Main()
{
var path1 = "C:/Program Files/";
var path2 = "Utilities/SystemUtilities";
ShowPathInformation(path1, path2);
path1 = "C:/";
path2 = "/Program Files";
ShowPathInformation(path1, path2);
path1 = "C:/Users/Public/Documents/";
path2 = "C:/Users/User1/Documents/Financial/";
ShowPathInformation(path1, path2);
}
private static void ShowPathInformation(string path1, string path2)
{
var result = Path.Join(path1.AsSpan(), path2.AsSpan());
Console.WriteLine($"Concatenating '{path1}' and '{path2}'");
Console.WriteLine($" Path.Join: '{result}'");
Console.WriteLine($" Path.Combine: '{Path.Combine(path1, path2)}'");
}
}
// The example displays the following output if run on a Windows system:
// Concatenating 'C:/Program Files/' and 'Utilities/SystemUtilities'
// Path.Join: 'C:/Program Files/Utilities/SystemUtilities'
// Path.Combine: 'C:/Program Files/Utilities/SystemUtilities'
//
// Concatenating 'C:/' and '/Program Files'
// Path.Join: 'C://Program Files'
// Path.Combine: '/Program Files'
//
// Concatenating 'C:/Users/Public/Documents/' and 'C:/Users/User1/Documents/Financial/'
// Path.Join: 'C:/Users/Public/Documents/C:/Users/User1/Documents/Financial/'
// Path.Combine: 'C:/Users/User1/Documents/Financial/'
♊ 注解
路径是提供文件或目录位置的字符串。路径可以包含绝对或相对位置信息。 绝对路径完全指定位置:无论当前位置如何,都可以唯一标识文件或目录。 相对路径指定部分位置:定位使用相对路径指定的文件时,当前位置用作起点。
类的 Path
大多数成员不会与文件系统交互,并且不验证路径字符串指定的文件是否存在。 Path
修改路径字符串的类成员(例如 ChangeExtension)对文件系统中的文件名称没有影响。
类的成员 Path
使你可以快速轻松地执行常见操作,例如确定文件扩展名是否是路径的一部分,并将两个字符串组合成一个路径名称。
类的所有成员都是静态的 Path
,因此无需路径实例即可调用。
备注
在接受路径作为输入字符串的成员中,该路径的格式必须良好或引发异常。 例如,如果路径完全限定,但以空格开头,则路径不会在类的方法中修整。 因此,路径格式不正确,并引发异常。 同样,路径或路径的组合不能完全限定两次。 例如,“c:temp c:\windows”在大多数情况下也会引发异常。 使用接受路径字符串的方法时,请确保路径格式良好。
♋ 更多方法
更多方法请查阅官方文档Path类。
⭐写在结尾:
文章中出现的任何错误请大家批评指出,一定及时修改。
希望写在这里的小伙伴能给个三连支持!