路徑取得方法總覽
| 方法 | 回傳內容 | 含檔名 | 適用專案類型 | 備註 |
Environment.CurrentDirectory | 目前工作目錄 | 否 | 所有 | 可被 Directory.SetCurrentDirectory 改變 |
Application.StartupPath | 啟動 EXE 所在目錄 | 否 | WinForms | 需參考 System.Windows.Forms |
Process.GetCurrentProcess().MainModule.FileName | 完整 EXE 路徑 | 是 | 所有 | 需 using System.Diagnostics;受限於權限 |
AppDomain.CurrentDomain.BaseDirectory | 應用程式域基底目錄 | 否 | 所有 | ASP.NET / Console / WinForms 通用,**推薦首選** |
Directory.GetCurrentDirectory() | 目前工作目錄 | 否 | 所有 | 同 Environment.CurrentDirectory |
AppDomain.CurrentDomain.SetupInformation.ApplicationBase | 應用程式基底目錄 | 否 | 所有 | 同 BaseDirectory,較底層 |
Assembly.GetExecutingAssembly().Location | 當前執行組件完整路徑 | 是 | 所有 | 若為 DLL 則回傳 DLL 路徑,非 EXE |
Application.ExecutablePath | 啟動 EXE 完整路徑 | 是 | WinForms | 同 Process.MainModule,但更簡潔 |
各類型專案推薦做法
.NET Core / .NET 5+ / ASP.NET Core(通用最佳)
// 專案根目錄(發布後為 exe 同層)
string baseDir = AppContext.BaseDirectory; // 等同 AppDomain.BaseDirectory
string exePath = Environment.ProcessPath; // .NET 6+ 取得 EXE 完整路徑
WinForms / WPF (.NET Framework)
// 只需目錄
string dir = Application.StartupPath; // WinForms
// 或
string dir = AppDomain.CurrentDomain.BaseDirectory; // 通用
// 需完整 EXE 路徑
string exe = Application.ExecutablePath; // WinForms 專用
// 或
string exe = Process.GetCurrentProcess().MainModule.FileName;
Class Library / 單元測試
// 取得 DLL 所在目錄
string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
實務常見陷阱
| 情境 | 錯誤做法 | 正確做法 |
| 讀取設定檔 | File.ReadAllText("config.json") | File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "config.json")) |
| 影子複製測試 | 用 Assembly.Location | 用 AppDomain.BaseDirectory 或 AppContext.BaseDirectory |
| ClickOnce 部署 | 假設路徑固定 | 用 ApplicationDeployment.CurrentDeployment.DataDirectory |
| Windows Service | Environment.CurrentDirectory 為 System32 | 用 AppContext.BaseDirectory |
路徑操作最佳實務
// 永遠用 Path.Combine 組合路徑,避免手工拼接 \ 或 /
string configPath = Path.Combine(AppContext.BaseDirectory, "Config", "appsettings.json");
// 取得專案根目錄(開發時),發布後自動轉為輸出目錄
string projectRoot = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, @"..\..\..\"));
總結
現代 .NET 專案首選 AppContext.BaseDirectory(目錄)與 Environment.ProcessPath(.NET 6+,完整路徑),兩者跨平台、跨專案類型、不受影子複製影響。舊專案相容可用 AppDomain.CurrentDomain.BaseDirectory。切記:永遠不要信任「目前工作目錄」,它隨使用者啟動方式、排程器、服務管理器隨時改變。