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("datalog.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),而该值可能被其他代码或调试器修改,导致路径解析结果不稳定。 在服务、ASP.NET Core 或多线程环境中,务必显式指定基准目录:
Path.GetFullPath(relativePath, basePath)(.NET 5+ 支持第二个参数) 若需兼容旧版本,先用
Path.Combine(AppContext.BaseDirectory, relativePath)再调用
GetFullPath注意:该方法会抛出
ArgumentException(非法字符)、
IOException(路径过长)等异常,生产环境必须 try-catch
跨平台路径拼接别硬拼字符串
直接用
"dir1" + "\" + "file.txt"或
"dir1/dir2/file.txt"在 Linux/macOS 上会失败。.NET 的
Path.Combine会根据运行时平台自动选择分隔符,且能处理冗余分隔符、空段等问题。 即使目标是 Windows-only 应用,也建议统一用
Path.Combine("a", "b", "c.txt") —— 它比字符串拼接更健壮,比如自动跳过 null或空字符串参数 不要对
Path.Combine结果再手动加斜杠,它已处理好结尾规则(除非你明确需要目录形式,此时可追加
Path.DirectorySeparatorChar) 如果路径来自 URL 或数据库字段,先用
Uri.UnescapeDataString或正则清理非法字符,再进
Path类处理 实际项目里最常出问题的不是函数不会用,而是忘了路径来源是否可信、当前工作目录是否可控、以及跨平台时分隔符和大小写的隐式假设。这些细节不写进日志,debug 时很难定位。
