Path.GetFileName 返回空或报错因输入为 null 或尾部斜杠路径;Path.GetDirectoryName 依赖路径格式而非文件系统;Path.GetFullPath 隐式绑定当前工作目录易致不稳定;跨平台拼接须用 Path.Combine 而非硬拼字符串。
Path.GetFileName 为什么返回空或报错
调用 Path.GetFileName 前必须确保传入的是合法路径字符串,不能是 null 或纯目录结尾(如 "C:\\temp\\")。Windows 下末尾反斜杠会被视为目录,函数直接返回空字符串;Linux/macOS 下同理。常见错误是把 Directory.GetCurrentDirectory() 拼接后没校验是否带尾部斜杠。
- 安全写法:先用
Path.IsPathRooted判断是否为绝对路径,再用Path.TrimEnd('\\', '/')清理尾部分隔符 - 若输入来自用户输入或配置文件,建议加
string.IsNullOrWhiteSpace(path)防御性检查 - 注意:该方法不验证文件是否存在,只做字符串解析
Path.GetDirectoryName 返回上级目录但结果不符合预期
Path.GetDirectoryName 的行为依赖路径格式而非实际文件系统结构。例如 Path.GetDirectoryName("log.txt") 返回空字符串(因为是相对无目录的文件名),而 Path.GetDirectoryName("data\\log.txt") 才返回 "data"。它不会自动补全当前工作目录,也不会访问磁盘。
- 想获取“当前执行目录下的某子目录”,应组合使用:
Path.Combine(Directory.GetCurrentDirectory(), "subdir") - 对 UNC 路径(如
\\\\server\\share\\file.txt)会正确返回\\\\server\\share,无需特殊处理 - 避免链式调用如
Path.GetDirectoryName(Path.GetDirectoryName(path))处理深度不确定路径——改用Path.GetFullPath规范化后再切分更可靠
Path.GetFullPath 解析相对路径时容易踩的坑
Path.GetFullPath 看似简单,但会隐式绑定到当前工作目录(Environment.CurrentDirectory),而该值可能被其他代码或调试器修改,导致路径解析结果不稳定。