在 C# 專案中「取得目前路徑」看似簡單,但不同 API 回傳的含義卻大不相同:有的是執行檔完整路徑、有的是工作目錄、有的是應用程式基底目錄。搞混它們常導致檔案找不到、部署失敗等難以除錯的問題。本文整理 7 種常用取得路徑的方式,並以實測輸出對照差異,幫助你精準選用。
| API | 回傳內容 | 典型用途 |
|---|---|---|
Process.GetCurrentProcess().MainModule.FileName | 目前執行檔完整路徑(含檔名) | 需要知道執行檔實體位置時 |
Environment.CurrentDirectory | 進程啟動時的工作目錄(可讀寫) | 相對路徑解析基準、命令列工具 |
Directory.GetCurrentDirectory() | 目前工作目錄(同 Environment.CurrentDirectory) | 同上,但為靜態方法呼叫風格 |
AppDomain.CurrentDomain.BaseDirectory | 應用程式基底目錄(以 \ 結尾) | Web/桌面應用尋找組態檔、相依組件 |
AppDomain.CurrentDomain.SetupInformation.ApplicationBase | 同 BaseDirectory,屬性來源不同 | 進階 AppDomain 設定檢查 |
Application.StartupPath (WinForms) | 啟動執行檔所在目錄(不含尾端 \) | WinForms 專案常用 |
Application.ExecutablePath (WinForms) | 啟動執行檔完整路徑(含檔名) | WinForms 專案需完整路徑時 |
var paths = new Dictionary<string, string> {
["Process.MainModule.FileName"] = Process.GetCurrentProcess().MainModule.FileName,
["Environment.CurrentDirectory"] = Environment.CurrentDirectory,
["Directory.GetCurrentDirectory()"] = Directory.GetCurrentDirectory(),
["AppDomain.BaseDirectory"] = AppDomain.CurrentDomain.BaseDirectory,
["AppDomain.ApplicationBase"] = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
["Application.StartupPath"] = Application.StartupPath,
["Application.ExecutablePath"] = Application.ExecutablePath
};
foreach (var kv in paths)
Console.WriteLine($"{kv.Key}: {kv.Value}");
假設專案建置於 D:\work\prj\VP-VPlatform\XmlAndXsd\bin\Release\,典型輸出如下:
Process.MainModule.FileName: D:\work\prj\VP-VPlatform\XmlAndXsd\bin\Release\XMLAndXsd.vshost.exe
Environment.CurrentDirectory: D:\work\prj\VP-VPlatform\XMLAndXsd\bin\Release
Directory.GetCurrentDirectory(): D:\work\prj\VP-VPlatform\XMLAndXsd\bin\Release
AppDomain.BaseDirectory: D:\work\prj\VP-VPlatform\XMLAndXsd\bin\Release\
AppDomain.ApplicationBase: D:\work\prj\VP-VPlatform\XMLAndXsd\bin\Release\
Application.StartupPath: D:\work\prj\VP-VPlatform\XMLAndXsd\bin\Release
Application.ExecutablePath: D:\work\prj\VP-VPlatform\XmlAndXsd\bin\Release\XMLAndXsd.EXE
Process.MainModule.FileName、Application.ExecutablePath 結果相同,前者適用通用專案,後者限 WinForms。BaseDirectory、ApplicationBase 以反斜線結尾,適合直接 Path.Combine 組合相對路徑;StartupPath、CurrentDirectory 無尾端斜線。Environment.CurrentDirectory 可被 Directory.SetCurrentDirectory 或外部程式改變,不可 作為固定資源路徑依據。AppDomain.BaseDirectory 或 IWebHostEnvironment.ContentRootPath,避免依賴 WinForms API。CurrentDirectory 讀取專案根目錄下的設定檔 → 使用者從別處啟動程式時失敗。BaseDirectory + "config.json" → 缺少路徑分隔符導致路徑錯誤,請改用 Path.Combine。BaseDirectory 指向測試執行器目錄 → 需透過 Assembly.GetExecutingAssembly().Location 定位專案輸出目錄。掌握各 API 的語意差異,並固定專案內部的「取得路徑」慣用模式,能大幅減少部署與執行時期的路徑相關 Bug。