C#从字符串中分离提取文件路径、文件名及扩展名
|
admin
2026年1月19日 20:11
本文热度 95
|
在 C# 中从完整文件名字符串中准确分离出**文件路径、文件名(不含扩展名)、文件扩展名(含 / 不含小数点)**,C# 提供了两种核心实现方案,其中推荐优先使用专门的文件操作 API,具体如下:
方案一:推荐优先使用 System.IO.Path 类(专业、无坑)
System.IO.Path 类是.NET 提供的专门用于处理文件路径、文件名的工具类,内置了跨平台兼容逻辑,能够自动处理不同操作系统的路径分隔符(\ 或 /),无需手动处理字符串分割,避免边界问题(如路径中包含多个小数点、多级目录等)。
核心关键方法
| | 返回结果示例(以路径@"D:\Projects\C#\DemoFile.txt"为例) |
|---|
Path.GetDirectoryName(string path) | 获取完整文件路径中的目录路径(文件所在文件夹路径) | D:\Projects\C# |
Path.GetFileName(string path) | | DemoFile.txt |
Path.GetFileNameWithoutExtension(string path) | | DemoFile |
Path.GetExtension(string path) | | .txt |
完整可运行代码示例
using System;
using System.IO;
namespace FilePathSplitDemo
{
class Program
{
static void Main(string[] args)
{
// 待处理的完整文件路径字符串(支持绝对路径、相对路径)
string fullFilePath = @"D:\Projects\C#\DemoFile.txt";
// 可选:测试相对路径
// string fullFilePath = @"..\Documents\TestFile.pdf";
try
{
// 1. 提取目录路径(文件所在文件夹)
string directoryPath = Path.GetDirectoryName(fullFilePath);
// 2. 提取完整文件名(含扩展名)
string fullFileName = Path.GetFileName(fullFilePath);
// 3. 提取文件名(不含扩展名)
string fileNameWithoutExt = Path.GetFileNameWithoutExtension(fullFilePath);
// 4. 提取文件扩展名(含小数点)
string fileExtension = Path.GetExtension(fullFilePath);
// 5. 可选:获取不含小数点的扩展名
string fileExtensionWithoutDot = string.IsNullOrEmpty(fileExtension)
? string.Empty
: fileExtension.TrimStart('.');
// 输出结果
Console.WriteLine("完整文件路径:" + fullFilePath);
Console.WriteLine("目录路径:" + directoryPath);
Console.WriteLine("完整文件名(含扩展名):" + fullFileName);
Console.WriteLine("文件名(不含扩展名):" + fileNameWithoutExt);
Console.WriteLine("文件扩展名(含小数点):" + fileExtension);
Console.WriteLine("文件扩展名(不含小数点):" + fileExtensionWithoutDot);
}
catch (ArgumentException ex)
{
Console.WriteLine("路径格式无效:" + ex.Message);
}
}
}
}
运行结果
plaintext
完整文件路径:D:\Projects\C#\DemoFile.txt
目录路径:D:\Projects\C#
完整文件名(含扩展名):DemoFile.txt
文件名(不含扩展名):DemoFile
文件扩展名(含小数点):.txt
文件扩展名(不含小数点):txt
方案二:手动字符串分割(不推荐,仅作了解)
如果特殊场景下无法使用 System.IO.Path 类,可以通过字符串操作方法(LastIndexOf、Substring)手动分割,但需要自行处理大量边界情况(如无扩展名、路径中包含小数点、路径分隔符不一致等),容易出现 bug。
核心思路
- 1. 先通过
LastIndexOf(Path.DirectorySeparatorChar) 或 LastIndexOf(Path.AltDirectorySeparatorChar) 找到最后一个路径分隔符,分离目录路径和完整文件名; - 2. 再通过
LastIndexOf('.') 在完整文件名中找到小数点,分离文件名(不含扩展名)和文件扩展名。
简易代码示例
using System;
namespace FilePathSplitManualDemo
{
class Program
{
static void Main(string[] args)
{
string fullFilePath = @"D:\Projects\C#\DemoFile.txt";
string directoryPath = string.Empty;
string fullFileName = string.Empty;
string fileNameWithoutExt = string.Empty;
string fileExtension = string.Empty;
// 1. 分离目录路径和完整文件名
int lastPathSeparatorIndex = fullFilePath.LastIndexOf(Path.DirectorySeparatorChar);
if (lastPathSeparatorIndex != -1)
{
directoryPath = fullFilePath.Substring(0, lastPathSeparatorIndex);
fullFileName = fullFilePath.Substring(lastPathSeparatorIndex + 1);
}
else
{
// 无目录路径,仅为文件名
fullFileName = fullFilePath;
}
// 2. 分离文件名(不含扩展名)和扩展名
int lastDotIndex = fullFileName.LastIndexOf('.');
if (lastDotIndex != -1)
{
fileNameWithoutExt = fullFileName.Substring(0, lastDotIndex);
fileExtension = fullFileName.Substring(lastDotIndex);
}
else
{
// 无扩展名
fileNameWithoutExt = fullFileName;
fileExtension = string.Empty;
}
// 输出结果
Console.WriteLine("目录路径:" + directoryPath);
Console.WriteLine("完整文件名(含扩展名):" + fullFileName);
Console.WriteLine("文件名(不含扩展名):" + fileNameWithoutExt);
Console.WriteLine("文件扩展名(含小数点):" + fileExtension);
}
}
}
关键说明与注意事项
- 1. **
System.IO.Path 类的优势**:无需关注路径分隔符类型(Windows 的\、Linux/macOS 的/),自动兼容跨平台场景,且能正确处理特殊情况(如文件名中包含多个小数点:test.file.txt,会正确提取扩展名.txt); - 2. 命名空间引用:使用
System.IO.Path 类必须在代码文件顶部添加 using System.IO; 引用; - 3. 空值 / 无效路径处理:实际开发中建议对输入路径进行非空判断,并包裹
try-catch 捕获 ArgumentException(无效路径格式)、ArgumentNullException(路径为null)等异常; - 4. 扩展名格式:
Path.GetExtension() 返回的扩展名包含小数点.,如果需要去除小数点,可使用 TrimStart('.') 方法(注意判空,避免空字符串报错)。
总结
- 1. 优先使用
System.IO.Path 类的专用方法(GetDirectoryName、GetFileName、GetFileNameWithoutExtension、GetExtension),简洁、安全、无坑; - 2. 手动字符串分割仅适用于特殊受限场景,需额外处理大量边界情况,不推荐常规开发使用;
- 3. 核心目标(分离路径、文件名、扩展名)可通过
Path 类快速实现,且具备跨平台兼容性。
阅读原文:原文链接
该文章在 2026/1/20 10:28:36 编辑过