Path.GetFullPath将合法相对路径转为当前工作目录下的绝对路径,不检查文件存在性;需确认Directory.GetCurrentDirectory()值,优先用AppDomain.CurrentDomain.BaseDirectory作基准,读取前须校验File.Exists。
用 Path.GetFullPath 转相对路径最直接
只要路径字符串合法(比如 "../config/app.json" 或 "./data.txt"),path.getfullpath 就能把它变成当前工作目录下的绝对路径。它不检查文件是否存在,只做字符串解析和拼接,所以快、稳、无副作用。
常见错误现象:Path.GetFullPath("data.txt") 返回的路径和你预期不符——大概率是因为当前工作目录不是你想象的那个目录(比如在 IDE 里运行时,工作目录是项目根目录;但双击 exe 启动时,工作目录是 exe 所在目录)。
- 务必确认
Directory.GetCurrentDirectory()的返回值,这是Path.GetFullPath的基准 - 如果想以某个特定目录为基准(比如程序主目录),先用
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data.txt")拼,再用Path.GetFullPath归一化 - 注意:传入 null 或空字符串会抛
ArgumentNullException或ArgumentException
读文件前别跳过 File.Exists 校验
Path.GetFullPath 不验证文件是否存在,而很多场景下你真正需要的是“这个相对路径对应的文件确实存在且可访问”。直接拿转换后的路径去 File.ReadAllText,很容易遇到 FileNotFoundException,但错误信息里显示的是绝对路径,反而掩盖了原始输入问题。
使用场景:配置加载、资源读取、日志路径初始化等对健壮性有要求的地方。
- 先
Path.GetFullPath(relativePath)得到绝对路径 - 再用
File.Exists(absPath)判断,失败时可明确提示“找不到配置文件:relativePath” - 避免用
try/catch捕获FileNotFoundException来兜底——这会让调试变慢,也掩盖了路径构造逻辑是否合理
AppDomain.CurrentDomain.BaseDirectory 和 Environment.CurrentDirectory 别混用
这两个值经常不一样,但新手容易默认它们相等。前者是 .exe 或启动程序集所在目录,后者是当前工作目录(可被 Directory.SetCurrentDirectory 修改,也可能被外部调用者改变)。
性能 / 兼容性影响:在 Windows 服务、IIS、dotnet tool 等上下文中,Environment.CurrentDirectory 可能指向系统目录或临时目录,完全不可控;而 BaseDirectory 始终稳定。
- 想让路径始终相对于程序自身位置,优先用
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "xxx") - 想支持用户在命令行指定相对路径(如
myapp.exe -c config.yaml),才考虑用Environment.CurrentDirectory,但必须加注释说明依赖 - .NET 5+ 可用
AppContext.BaseDirectory替代AppDomain.CurrentDomain.BaseDirectory,语义更清晰
跨平台路径处理要注意斜杠和盘符
Windows 下 Path.GetFullPath("C:file.txt") 会补全为 C:currentdirile.txt,而 Linux/macOS 下没有盘符概念,/ 开头就是绝对路径,Path.GetFullPath 对非绝对路径一律按当前工作目录补全。
参数差异:所有 Path 方法都自动适配当前系统分隔符(Path.AltDirectorySeparatorChar vs Path.DirectorySeparatorChar),但硬编码 "\\" 或 "//" 仍会导致跨平台失败。
- 永远用
Path.Combine("a", "b", "c.txt")拼路径,而不是"a/b/c.txt" - 不要假设
Path.GetFullPath("a/b")在 Windows 上一定返回带反斜杠的结果——它返回的是逻辑绝对路径,内部表示可能用正斜杠,但 I/O API 都兼容 - 如果路径来自用户输入或配置文件,先用
Path.GetInvalidPathChars()过滤非法字符,尤其注意 Linux 下:是合法文件名,Windows 下不是
BaseDirectory 和 CurrentDirectory 的混淆、不校验存在性、硬编码分隔符,这三个点最容易反复踩坑。


















