專案部署時,相對路徑 data.txt 到底指向哪裡?取決於「目前工作目錄」與「執行檔所在目錄」可能不同。本文整理 7 種取得路徑的方法,分析適用場景與差異。
| # | 程式碼 | 回傳值 | 適用場景 | 備註 |
|---|---|---|---|---|
| 1 | Process.GetCurrentProcess().MainModule.FileName | 完整執行檔路徑(含檔名) | 需完整路徑含檔名 | 需 System.Diagnostics;可能需較高權限 |
| 2 | Environment.CurrentDirectory | 目前工作目錄(進程啟動目錄) | 相對路徑解析基準 | 可讀寫;SetCurrentDirectory 會影響全域 |
| 3 | Directory.GetCurrentDirectory() | 同上(靜態方法) | 同上 | 本質呼叫 Win32 GetCurrentDirectory |
| 4 | AppDomain.CurrentDomain.BaseDirectory | 應用程式基底目錄(通常為執行檔資料夾) | 尋找同目錄下的組態檔、資源檔 | ASP.NET 下為網站實體路徑;末尾含 \ |
| 5 | AppDomain.CurrentDomain.SetupInformation.ApplicationBase | 同上 | 同上 | 屬性可寫(罕用) |
| 6 | Application.StartupPath (WinForms) | 啟動執行檔目錄 | WinForms 桌面應用 | 需參考 System.Windows.Forms;末尾無 \ |
| 7 | Application.ExecutablePath (WinForms) | 完整執行檔路徑含檔名 | WinForms 桌面應用 | 同上 |
// 假設執行檔:C:\MyApp\MyApp.exe
// 使用者在 D:\Work 執行:C:\MyApp\MyApp.exe
Environment.CurrentDirectory // D:\Work
AppDomain.CurrentDomain.BaseDirectory // C:\MyApp\
cd、排程器設定影響。| 類型 | 推薦取得「應用程式根目錄」 | 避免使用 |
|---|---|---|
| 主控台 / WPF / Class Library | AppDomain.CurrentDomain.BaseDirectory | Environment.CurrentDirectory |
| WinForms | Application.StartupPath | Directory.GetCurrentDirectory() |
| ASP.NET Core | IWebHostEnvironment.ContentRootPath (DI 注入) | 以上靜態屬性 |
| ASP.NET Framework | HttpRuntime.AppDomainAppPath 或 Server.MapPath("~") | 同上 |
| 單元測試 | TestContext.CurrentContext.TestDirectory (NUnit) / AppContext.BaseDirectory | 相對路徑 |
// 取得執行檔目錄(含單一檔案發佈支援)
var exeDir = Path.GetDirectoryName(
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
);
// 或使用 AppContext(推薦)
var baseDir = AppContext.BaseDirectory; // 等同 AppDomain.BaseDirectory,跨平台
// 組合路徑永遠用 Path.Combine
var configPath = Path.Combine(baseDir, "appsettings.json");
File.Open("data.txt") 會在 CurrentDirectory 尋找,部署時易出錯。C:\Windows\System32\inetsrv。Assembly.Location 回傳空字串,必須用 Process.GetCurrentProcess().MainModule.FileName 或 AppContext.BaseDirectory。Path.Combine、Path.DirectorySeparatorChar,勿硬編碼 \ 或 /。「工作目錄」與「執行檔目錄」是兩個不同概念。預設用 AppContext.BaseDirectory(或對應平台專屬 API)定位應用程式自帶資源,只有在明確需要「使用者當前操作目錄」時才用 Environment.CurrentDirectory。養成 Path.Combine 習慣,讓路徑處理零 Bug。