首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 取得目前工作目錄與執行檔目錄的完整方法比較

     編輯:關於C語言

常見需求:我的檔案在哪?

專案部署時,相對路徑 data.txt 到底指向哪裡?取決於「目前工作目錄」與「執行檔所在目錄」可能不同。本文整理 7 種取得路徑的方法,分析適用場景與差異。

方法總覽

#程式碼回傳值適用場景備註
1Process.GetCurrentProcess().MainModule.FileName完整執行檔路徑(含檔名)需完整路徑含檔名需 System.Diagnostics;可能需較高權限
2Environment.CurrentDirectory目前工作目錄(進程啟動目錄)相對路徑解析基準可讀寫;SetCurrentDirectory 會影響全域
3Directory.GetCurrentDirectory()同上(靜態方法)同上本質呼叫 Win32 GetCurrentDirectory
4AppDomain.CurrentDomain.BaseDirectory應用程式基底目錄(通常為執行檔資料夾)尋找同目錄下的組態檔、資源檔ASP.NET 下為網站實體路徑;末尾含 \
5AppDomain.CurrentDomain.SetupInformation.ApplicationBase同上同上屬性可寫(罕用)
6Application.StartupPath (WinForms)啟動執行檔目錄WinForms 桌面應用需參考 System.Windows.Forms;末尾無 \
7Application.ExecutablePath (WinForms)完整執行檔路徑含檔名WinForms 桌面應用同上

核心差異:工作目錄 vs 執行檔目錄


// 假設執行檔:C:\MyApp\MyApp.exe
// 使用者在 D:\Work 執行:C:\MyApp\MyApp.exe

Environment.CurrentDirectory           // D:\Work
AppDomain.CurrentDomain.BaseDirectory  // C:\MyApp\
  • 工作目錄:啟動進程時的當下目錄,受捷徑「開始位置」、命令列 cd、排程器設定影響。
  • 執行檔目錄:執行檔實際存放位置,相對穩定,適合存放應用程式自帶資源(設定檔、嵌入資料庫等)。

各應用程式類型推薦做法

類型推薦取得「應用程式根目錄」避免使用
主控台 / WPF / Class LibraryAppDomain.CurrentDomain.BaseDirectoryEnvironment.CurrentDirectory
WinFormsApplication.StartupPathDirectory.GetCurrentDirectory()
ASP.NET CoreIWebHostEnvironment.ContentRootPath (DI 注入)以上靜態屬性
ASP.NET FrameworkHttpRuntime.AppDomainAppPath 或 Server.MapPath("~")同上
單元測試TestContext.CurrentContext.TestDirectory (NUnit) / AppContext.BaseDirectory相對路徑

跨平台相容寫法 (.NET Core / .NET 5+)


// 取得執行檔目錄(含單一檔案發佈支援)
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");

常見坑

  1. 相對路徑假設工作目錄:File.Open("data.txt") 會在 CurrentDirectory 尋找,部署時易出錯。
  2. ASP.NET 中 CurrentDirectory 不可靠:可能指向 C:\Windows\System32\inetsrv。
  3. 單一檔案發佈:Assembly.Location 回傳空字串,必須用 Process.GetCurrentProcess().MainModule.FileName 或 AppContext.BaseDirectory。
  4. 路徑分隔符:跨平台請用 Path.Combine、Path.DirectorySeparatorChar,勿硬編碼 \ 或 /。

結語

「工作目錄」與「執行檔目錄」是兩個不同概念。預設用 AppContext.BaseDirectory(或對應平台專屬 API)定位應用程式自帶資源,只有在明確需要「使用者當前操作目錄」時才用 Environment.CurrentDirectory。養成 Path.Combine 習慣,讓路徑處理零 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved