当前程序路径一般指可执行文件(.exe)所在目录,不是解决方案目录或项目目录。直接用
Application.ExecutablePath或
System.Reflection.Assembly.GetExecutingAssembly().Location获取完整路径,再用
Path.GetDirectoryName()提取目录即可。别用
Environment.CurrentDirectory,它可能被用户或代码修改过,不可靠。
获取当前可执行文件所在目录(最常用)
这是绝大多数场景需要的“程序路径”,比如读取同级配置文件、写日志到本地文件夹:
Path.GetDirectoryName(Application.ExecutablePath)—— WinForms 项目推荐,简洁稳定
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)—— 控制台、WPF、类库通用,
GetExecutingAssembly返回当前运行代码所在的程序集
AppContext.BaseDirectory—— .NET Core / .NET 5+ 推荐,尤其在发布为单文件时更准确(注意:单文件发布下
Location可能为空或指向临时解压路径)
获取当前工作目录(慎用)
Environment.CurrentDirectory返回进程启动时的工作目录,不是程序文件位置。命令行中 cd 到某目录再运行 exe,这里就会是那个目录。调试时 VS 默认设为项目目录,但发布后行为不确定: 仅在明确需要“用户启动上下文”时才用(如批量处理当前目录下的文件) 不要用它替代程序路径,否则部署后容易出错
获取项目/源码相关路径(仅开发阶段参考)
这些路径在编译后不存在,不能用于生产环境:
Directory.GetCurrentDirectory()—— 同
Environment.CurrentDirectory,开发时常是项目根目录,但不保证
AppDomain.CurrentDomain.BaseDirectory—— 通常和
AppContext.BaseDirectory一致,.NET Framework 时代常用,新项目优先用后者
typeof(Program).Assembly.Location—— 和
GetExecutingAssembly().Location类似,但指定类型更明确,适合在类库中获取自身程序集位置
读写配置或资源文件的实用建议
路径只是手段,目标是可靠访问文件:
配置文件(如 appsettings.json)建议放在程序目录,用Path.Combine(AppContext.BaseDirectory, "appsettings.json")想让程序“自带”资源,把文件属性设为
Copy to Output Directory = Copy always,然后按相对路径读取 避免硬编码绝对路径;跨平台注意用
Path.Combine()拼接,别用
+或
/
基本上就这些。记住核心:要“程序放哪儿”,就用
AppContext.BaseDirectory(新项目)或
Path.GetDirectoryName(Application.ExecutablePath)(WinForms),其它路径按需谨慎选用。
