CodeGym /课程 /C# SELF /类 Path — 处理路径的好帮手

类 Path — 处理路径的好帮手

C# SELF
第 39 级, 课程 4
可用

1. 介绍

为啥需要类 Path?

处理文件离不开路径。路径告诉程序去哪里找文件或文件夹。

日常生活中你有地址:市 [城市名],街 [街道名],号 [房号]。对计算机来说,文件路径看起来像这样:
"C:\Program Files\MyApp\data.txt"
或者,如果你喜欢跨平台:
"/home/username/documents/data.txt"

问题是:不同操作系统用不同的分隔符,可能对长度或允许的字符有不同限制。即便用户手动输入路径,也可能出错:并不是所有人都知道 Windows 里要用成对的反斜杠(\\),或者 Unix 类系统路径以 / 开头。

为了不自己重造轮子,.NET 提供了一个静态类 System.IO.Path,它负责解析、修改和拼接路径。我们来更熟悉这个“超级英雄”吧!

Path 常解决的任务

  • 获取文件扩展名。
  • 从完整路径中获取文件或目录名。
  • 把路径片段拼成绝对或相对路径。
  • 检查路径在当前操作系统下是否合法。
  • 替换文件扩展名。
  • 确定基础目录和父目录。
  • 跨平台处理路径分隔符。
  • 处理临时文件和临时目录。

表:主要方法和属性 Path

方法/属性 作用
GetFileName(path)
带扩展名的文件名
GetExtension(path)
文件扩展名(比如 .txt)
GetDirectoryName(path)
文件所在文件夹的路径
GetFileNameWithoutExtension(path)
不带扩展名的文件名
Combine(...)
稳妥且跨平台地拼接路径片段
ChangeExtension(path, ext)
更改文件扩展名
GetFullPath(path)
绝对路径
GetInvalidPathChars()
路径中不允许的字符
GetInvalidFileNameChars()
文件名中不允许的字符
GetTempPath()
系统临时文件夹的路径
GetTempFileName()
创建一个临时文件并返回其路径
DirectorySeparatorChar
目录分隔符(比如 \ 或 /)
AltDirectorySeparatorChar
备用分隔符
PathSeparator
环境变量中路径的分隔符(; 或 :)

2. 提取路径部分

几乎所有 Path 的方法都是静态的。无需创建实例——直接调用 Path.方法名(...)。

常用工具:GetFileName, GetDirectoryName, GetExtension, GetFileNameWithoutExtension。有时候你只需要文件名、扩展名或所在文件夹。

示例:


using System;
using System.IO;

string path = @"C:\Projects\MyApp\data\info.json";

Console.WriteLine(Path.GetFileName(path));               // info.json
Console.WriteLine(Path.GetFileNameWithoutExtension(path)); // info
Console.WriteLine(Path.GetExtension(path));              // .json
Console.WriteLine(Path.GetDirectoryName(path));          // C:\Projects\MyApp\data
代码 结果
@"C:\Projects\MyApp\data\info.json"
info.json
Path.GetFileName(path)
Path.GetExtension(path)
.json
Path.GetFileNameWithoutExtension(path)
info
Path.GetDirectoryName(path)
C:\Projects\MyApp\data

3. 拼接路径:Combine

新手最常犯的错是用字符串简单相加来拼路径。别那样!

错误示例:


// 会出问题!
string fullPath = "C:\\Projects\\MyApp\\" + "data\\info.json";

要是忘了加斜杠/反斜杠?或者用错分隔符?
正确做法是用 Path.Combine。


string folder = @"C:\Projects\MyApp";
string filename = "data\\info.json";

string fullPath = Path.Combine(folder, filename);

// 在任何平台上都会正确拼接路径段!
Console.WriteLine(fullPath); // C:\Projects\MyApp\data\info.json

相对路径的处理

如果传入相对路径,Path.Combine 会正确处理它。尽量把路径拆成片段来传!


string baseDir = "C:/work";
string subDir = "docs";
string file = "readme.txt";

string path = Path.Combine(baseDir, subDir, file);
// 结果: "C:/work/docs/readme.txt"(或者用反斜杠,取决于平台)

给进阶同学的事实:在 Path.Combine 里会使用你操作系统的正确分隔符。Windows 用的是 \,Linux/Mac 用的是 /。这样你的代码会更跨平台,很多坑都能避免。

4. 检查路径是否合法

有专门的方法:GetInvalidPathChars, GetInvalidFileNameChars。

比如用户在界面里输入了文件名或路径,怎么保证字符串不包含禁止字符?直接问 Path 就行。


char[] invalidPathChars = Path.GetInvalidPathChars();
char[] invalidFileNameChars = Path.GetInvalidFileNameChars();

string userInput = "data*?.txt";
foreach (char c in userInput)
{
    if (Array.Exists(invalidFileNameChars, x => x == c))
    {
        Console.WriteLine($"文件名中有不允许的字符: {c}");
    }
}
// 输出: 文件名中有不允许的字符: *

如果程序从用户或不可靠来源获取路径,这一点尤其重要!

5. 有用的方法

更改文件扩展名:ChangeExtension

有时需要把文件扩展名换成别的,只需一行代码!


string oldPath = @"C:\data\report.csv";
string newPath = Path.ChangeExtension(oldPath, ".bak");

Console.WriteLine(newPath); // C:\data\report.bak

ChangeExtension 只改扩展名,不动路径的其他部分。

获取绝对路径:GetFullPath

如果路径是相对的,可以用这个方法得到绝对(完整)路径。


string relPath = @"..\..\logs\2024.log";
string absPath = Path.GetFullPath(relPath);

Console.WriteLine(absPath);
// 例如: C:\Projects\MyApp\logs\2024.log

实际结果取决于应用的当前工作目录(Directory.GetCurrentDirectory())。

路径分隔符:Path.DirectorySeparatorChar

记住,Windows 的分隔符是 \,Linux 的是 /。
别自己瞎搞,用这些属性:

  • Path.DirectorySeparatorChar — 当前操作系统的主目录分隔符(Windows 上是 '\\',Linux 上是 '/')。
  • Path.AltDirectorySeparatorChar — 备用分隔符(在 Windows 上 '/' 也常能用)。
  • Path.PathSeparator — 环境变量里路径的分隔符(Windows 上是 ';',Linux 上是 ':')。

用法示例:


Console.WriteLine(Path.DirectorySeparatorChar);     // \  (在 Windows 上)
Console.WriteLine(Path.AltDirectorySeparatorChar);  // /  (在 Windows 上)
Console.WriteLine(Path.PathSeparator);              // ;  (在 Windows 上)

如果你在自己实现目录遍历之类的逻辑,这些东西就很有用。

6. 临时文件和目录

程序有时需要临时文件,比如保存中间结果或做原子更新。

  • Path.GetTempPath() — 返回系统临时文件夹的路径。
  • Path.GetTempFileName() — 创建一个带唯一名字的临时文件并返回它的路径。

示例:


string tempDir = Path.GetTempPath();
Console.WriteLine($"临时文件夹: {tempDir}");

string tempFile = Path.GetTempFileName();
Console.WriteLine($"创建了临时文件: {tempFile}");

这些方法能避免名字冲突,也不用你操心临时文件放哪儿。

7. 常见错误和搞笑的坑

第一,习惯用字符串相加拼路径。"哦,这很简单:folder + "\\\" + file"!但实际会出现双斜杠、漏斜杠、在 Linux 上的错误分隔符。如果不使用 Path.Combine,就是自己挖坑。

第二,忘记禁止字符。比如用户在文件名里输入了 *(“星号”)——那就会出异常。

第三,混淆相对路径和绝对路径,结果程序在不对的地方找文件,比如你想的 "notebook.txt" 实际不在那儿。

建议:每次处理文件路径时——拼接、解析、改扩展名、做错误保护——先想一句话:“这事能不能交给 Path 的某个方法来做?”99% 的情况下答案是能,而且微软团队已经在各种 edge-case 上测试过这些方法。

2
任务
C# SELF, 第 39 级, 课程 4
已锁定
获取文件名和扩展名
获取文件名和扩展名
1
调查/小测验
File类和Directory类第 39 级,课程 4
不可用
File类和Directory类
文件系统操作
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION