ZetCode

C# 路径

最后修改于 2025 年 5 月 14 日

本教程探讨了在 C# 中使用 Path 类进行有效的文件和目录路径管理,确保无缝的跨平台兼容性。

正确处理文件和目录路径对于构建在不同操作系统(如 Windows、Linux 和 macOS)上可靠运行的健壮应用程序至关重要。Path 类提供了一组静态方法,可帮助您操作、组合和分析路径字符串,而无需担心平台特定的路径分隔符或约定。 通过掌握这些技术,您可以避免与文件访问和导航相关的常见陷阱和错误。

在实际应用中,您经常需要处理文件和目录,以执行诸如读取配置文件、保存用户数据、记录日志或处理文档之类的任务。 每个操作系统都有其自己的文件路径约定,例如不同的目录分隔符(例如,Linux/macOS 上的“/”和 Windows 上的“\\”)以及有效文件名的规则。 手动处理这些差异可能会导致细微的错误、安全问题或仅在一个平台上运行的代码。

Path 类是 System.IO 命名空间的一部分,提供了强大的方法,用于提取根路径、检索目录名称、获取文件扩展名以及生成唯一的文件名。 它还提供了用于组合路径、规范化路径以及验证文件或目录名称的实用程序。 掌握这些功能可以显着简化 C# 应用程序中的文件操作,使您的代码更易于维护、更安全且更易于在不同环境中移植。

以下是关键方法及其功能的列表

方法 描述
Path.Combine(string path1, string path2) 将两个路径连接成一个有效的路径。
Path.GetFileName(string path) 从给定的路径中提取文件名。
Path.GetFileNameWithoutExtension(string path) 检索没有扩展名的文件名。
Path.GetDirectoryName(string path) 返回路径的目录部分。
Path.GetExtension(string path) 从指定的路径获取文件扩展名。
Path.GetFullPath(string path) 将相对路径转换为绝对路径。
Path.GetTempFileName() 生成一个临时文件名。
Path.GetRandomFileName() 创建一个密码安全的随机文件名。
Path.GetPathRoot(string path) 提取路径的根部分。
Path.HasExtension(string path) 检查路径是否具有文件扩展名。
Path.IsPathRooted(string path) 确定路径是绝对路径还是相对路径。
Path.ChangeExtension(string path, string extension) 修改路径的文件扩展名。

C# Path.GetPathRoot

Path.GetPathRoot 方法检索指定路径的根目录,从而实现跨平台的一致路径处理。

Program.cs
var path = "/home/janbodnar/tmp/";
var root = Path.GetPathRoot(path);

Console.WriteLine(root);

此示例输出提供的路径的根目录,说明了基本的路径解析。

$ dotnet run
/

C# Path.GetDirectoryName

Path.GetDirectoryName 方法提取路径的目录部分,对于导航文件系统结构很有用。

Program.cs
var path = "/home/janbodnar/words.txt";
var dirName = Path.GetDirectoryName(path);

Console.WriteLine(dirName);

此示例显示指定文件路径的目录名称,演示了目录提取。

$ dotnet run
/home/janbodnar

C# Path.GetFullPath

Path.GetFullPath 方法将相对路径转换为绝对路径,解析诸如“.”或“..”之类的引用。

Program.cs
var path = ".";

var fullPath = Path.GetFullPath(path);

Console.WriteLine(fullPath);

此示例输出当前工作目录的绝对路径,展示了路径解析。

$ dotnet run
/home/janbodnar/Documents/prog/c#/path/FullPath

C# Path.GetRandomFileName

Path.GetRandomFileName 方法生成随机的文件或目录名称,非常适合创建临时文件。

Program.cs
var randFileName = Path.GetRandomFileName();
Console.WriteLine(randFileName);

Console.WriteLine(Path.GetTempPath());

此示例输出一个随机生成的文件名,可用于创建唯一的临时文件。

$ dotnet run
j1wtvfxj.zrh

C# Path 文件名和扩展名

Path.GetExtension 方法检索文件的扩展名,包括句点。 Path.GetFileName 方法返回带有其扩展名的文件名,而 Path.GetFileNameWithoutExtension 排除扩展名。

Program.cs
var path = "/home/janbodnar/words.txt";

var fileExt = Path.GetExtension(path);
Console.WriteLine(fileExt);

var fileName = Path.GetFileName(path);
Console.WriteLine(fileName);

var fileNameWithoutExt = Path.GetFileNameWithoutExtension(path);
Console.WriteLine(fileNameWithoutExt);

此示例从路径中提取并显示文件扩展名、完整文件名和不带扩展名的文件名。

$ dotnet run
.txt
words.txt
words

C# Path.Combine

Path.Combine 方法将字符串连接到有效的文件路径中,自动处理平台特定的分隔符。

Program.cs
var fullPath1 = Path.Combine("/home", "janbodnar", "words.txt");
Console.WriteLine(fullPath1);

var fullPath2 = Path.Combine("/home/janbodnar/", "/home/janbodnar/words2.txt");
Console.WriteLine(fullPath2);

此示例组合字符串以形成文件路径,演示了跨平台的强大路径构建。

$ dotnet run
/home/janbodnar/words.txt
/home/janbodnar/words2.txt

C# Path.ChangeExtension

Path.ChangeExtension 方法修改文件的扩展名,从而可以轻松地转换路径字符串中的文件类型。

Program.cs
var path = "/home/janbodnar/words.txt";
var newPath = Path.ChangeExtension(path, "bak");

Console.WriteLine(newPath);

此示例将文件扩展名从 .txt 更改为 .bak,说明了扩展名修改。

$ dotnet run
/home/janbodnar/words.bak

C# Path.IsPathFullyQualified

Path.IsPathFullyQualified 方法检查路径是否是绝对路径,有助于验证应用程序中的路径输入。

Program.cs
var path1 = "/home/janbodnar/words.txt";
var path2 = "words.txt";

Console.WriteLine(Path.IsPathFullyQualified(path1));
Console.WriteLine(Path.IsPathFullyQualified(path2));

此示例测试路径是否完全限定,对于绝对路径返回 true,对于相对路径返回 false

$ dotnet run
True
False

C# Path.Join with span-based operations

Path.Join 方法使用 spans 有效地组合路径段,为 Path.Combine 提供了一种现代的、内存高效的替代方案。

Program.cs
var path = new char[100];
Path.Join(path, "/home".AsSpan(), "janbodnar".AsSpan(), "docs".AsSpan());

Console.WriteLine(path);

此示例将 Path.Join 与字符 spans 一起使用来构建路径,演示了用于大规模应用程序的有效字符串操作。

$ dotnet run
/home/janbodnar/docs

C# Path.GetRelativePath

Path.GetRelativePath 方法计算从一个目录到另一个目录的相对路径,对于文件系统导航和比较很有用。

Program.cs
var basePath = "/home/janbodnar/docs";
var targetPath = "/home/janbodnar/docs/projects/words.txt";

var relativePath = Path.GetRelativePath(basePath, targetPath);
Console.WriteLine(relativePath);

此示例计算从基本目录到目标文件的相对路径,简化了文件系统操作中的路径操作。

$ dotnet run
projects/words.txt

C# Normalize a path with redundant segments

Path.GetFullPath 方法可用于规范化包含冗余段(如 ... 或混合分隔符)的路径。 这对于清理用户输入或将相对路径解析为其规范形式很有用。

Program.cs
var messyPath = "/home/janbodnar/../janbodnar/docs/./file.txt";
var normalizedPath = Path.GetFullPath(messyPath);

Console.WriteLine(normalizedPath);

此示例输出规范化的绝对路径,解析所有冗余段。

$ dotnet run
/home/janbodnar/docs/file.txt

C# Validate file name characters

Path.GetInvalidFileNameChars 方法返回一个不允许在文件名中使用的字符数组。 您可以使用它来检查用户输入并防止文件系统错误。

Program.cs
var fileName = "my:invalid|file?.txt";
var invalidChars = Path.GetInvalidFileNameChars();

bool hasInvalid = fileName.IndexOfAny(invalidChars) != -1;
Console.WriteLine(hasInvalid ? "Invalid file name" : "Valid file name");

此示例检查文件名是否包含任何无效字符,如果包含,则打印警告。

$ dotnet run
Invalid file name

C# Split a path into its components

您可以使用 Path.GetDirectoryNamePath.GetFileNamePath.GetExtension 的组合将完整文件路径分解为其目录、文件名和扩展名部分。

Program.cs
var path = "/home/janbodnar/docs/report.pdf";

var dir = Path.GetDirectoryName(path);
var file = Path.GetFileName(path);
var ext = Path.GetExtension(path);

Console.WriteLine($"Directory: {dir}");
Console.WriteLine($"File: {file}");
Console.WriteLine($"Extension: {ext}");

此示例分别打印路径的每个组件,使其易于分析或处理路径字符串。

$ dotnet run
Directory: /home/janbodnar/docs
File: report.pdf
Extension: .pdf

C# Combine user input safely into a path

应使用 Path.Combine 方法将用户提供的文件夹和文件名安全地连接到有效路径中。 这样可以防止手动字符串连接的问题,并确保跨平台兼容性。

Program.cs
var userFolder = "docs";
var userFile = "notes.txt";

var safePath = Path.Combine("/home/janbodnar", userFolder, userFile);
Console.WriteLine(safePath);

此示例将用户输入组合到有效的文件路径中,自动处理分隔符。

$ dotnet run
/home/janbodnar/docs/notes.txt

来源

Path 类 - 语言参考

本文探讨了使用 Path 类在 C# 中处理路径字符串的高级技术。

作者

我是 Jan Bodnar,一位敬业的程序员,在软件开发方面拥有丰富的经验。 自 2007 年以来,我撰写了 1,400 多篇编程文章和八本电子书。 凭借十多年的编程教学经验,我通过全面的教程分享我的专业知识。

列出所有 C# 教程