path.getfullpath以当前工作目录为基准解析相对路径并返回标准化绝对路径,但不基于项目根或程序集位置;需用appcontext.basedirectory等获取稳定基址。

相对路径转绝对路径用 Path.GetFullPath
在 C# 中,把相对路径转成绝对路径最直接的方式就是调用 Path.GetFullPath。它会以当前工作目录(Environment.CurrentDirectory)为基准解析相对路径,返回标准化后的绝对路径。
常见错误是误以为它会自动识别项目根目录或程序集位置——它不会。比如你在调试时双击启动 exe,当前目录可能是 C:WindowsSystem32,这时 "./config.json" 就会解析成 C:WindowsSystem32config.json,而非你期望的项目目录下。
- 若需基于可执行文件位置解析,应先用
AppContext.BaseDirectory或Assembly.GetExecutingAssembly().Location获取路径,再拼接 -
Path.GetFullPath会自动处理".."、"."、重复斜杠等,但不检查文件是否存在 - 跨平台注意:在 Linux/macOS 上它仍返回带正斜杠的路径(如
/home/user/app/config.json),但 .NET Core+ 已统一支持正斜杠作为分隔符
绝对路径判断用 Path.IsPathRooted
不要用字符串.StartsWith("C:\\") 或正则去判断是否为绝对路径——Windows 下有 UNC 路径("\\server\share")、Linux 下有根路径("/home"),Path.IsPathRooted 才是跨平台可靠的判断方式。
这个方法只看路径“是否已含根”,不验证路径合法性或存在性。例如 "C:file.txt"(缺反斜杠)在 Windows 上返回 false,而 "C:ile.txt" 返回 true;"/" 和 "/a/b" 在 Unix-like 系统上都返回 true。
- 它不区分驱动器号路径和 UNC,只要结构上“已锚定到根”就返回 true
- 对空字符串、
null抛ArgumentException,使用前建议先判空 - 不能替代
File.Exists或Directory.Exists,仅作格式判断
拼接路径别用字符串拼接,用 Path.Combine
手动拼接 "C:\app" + "\" + "log.txt" 或 "./data" + "/" + "output.bin" 极易出错:多一个斜杠、少一个斜杠、跨平台分隔符不一致、路径末尾意外带 "\" 导致覆盖上级目录。
Path.Combine 会自动清理冗余分隔符、处理空段、适配运行时平台的路径分隔符(Path.DirectorySeparatorChar)。
- 传入参数中任意一段含根(如
"C:\temp"),它会丢弃前面所有段,从该根开始拼——这是有意设计,不是 bug - 如果需要“强制追加到某路径末尾”,确保前缀不以分隔符结尾,或先用
Path.TrimEndingDirectorySeparator(.NET 5+)处理 - 对用户输入的路径片段,建议先用
Path.GetFileName或Path.GetInvalidFileNameChars()过滤非法字符,避免注入式路径遍历(如"../../etc/passwd")
加载资源时优先用 AppContext.BaseDirectory 而非 Environment.CurrentDirectory
很多开发者默认用 Environment.CurrentDirectory 拼配置文件路径,但这个值可能被第三方库、Shell 启动方式甚至 Directory.SetCurrentDirectory 修改,极不稳定。
AppContext.BaseDirectory 始终指向应用程序主程序集所在目录(即 .exe 或 .dll 的父目录),是部署后最可预测的“应用根”。配合 Path.Combine 使用,能稳定定位同级的 config/、data/ 等子目录。
- ASP.NET Core 应用另有
IWebHostEnvironment.ContentRootPath,不应混用 - 单元测试中
AppContext.BaseDirectory指向 test runner 的输出目录(如bin/Debug/net6.0/),若需访问测试项目中的文件,要用Assembly.GetCallingAssembly().Location反推 - 发布为单文件(
publishTrimmed=true或IncludeAllContentForSelfExtract=true)时,AppContext.BaseDirectory指向临时解压目录,此时读写外部文件需额外考虑生命周期










