C# 相對路徑的檔案輸出問題

不論在「主控台應用程式」(指令視窗應用程式、Console Application) 、 Windows Forms 應用程式或其他的應用程式中,都有一個屬性叫做 Environment.CurrentDirectory ,從名稱上來看就可以知道是取得當前目錄,不過具體是哪裡的目錄呢? 讓我們來測試看看。

測試程式碼:
    
var path = Environment.CurrentDirectory;
Console.WriteLine($"path: {path}");

File.WriteAllText("test.txt", path);
    

直接執行後發現就是在執行檔所在的那個目錄,很合理。
    
C:\ConsoleAppEnvironmenTest\ConsoleAppEnvironmenTest\bin\Debug\net6.0
    

那如果從其他地方呼叫程式呢?
我們開啟指令視窗,從桌面上執行看看
	
C:\ConsoleAppEnvironmenTest\ConsoleAppEnvironmenTest\bin\Debug\net6.0\ConsoleAppEnvironmenTest.exe
path: C:\Users\ruyut\Desktop
	

疑?路徑怎麼在桌面?輸出的檔案怎麼也在桌面?不是應該要在執行檔旁邊嗎?

仔細看了一下說明文件
    
Environment.CurrentDirectory 屬性: 取得或設定目前工作目錄的完整路徑。
    

啊,原來 Environment.CurrentDirectory 就是呼叫程式時的路徑阿。並且剛剛在輸出檔案時是使用相對路徑(工作目錄),所以就跑到這裡來了。

最近在設定開機自動執行程式,然後開機後有順利啟動程式,只是一直找不到 log 檔案,原來就是這個原因啊(之前 log 檔案都設定絕對路徑)

那開機自動啟動的程式是被從哪個路徑呼叫的呢?筆者測試發現是在 C:\Windows\System32 ,所以如果遇到同樣的狀況,到這個路徑找找或許就會發現失蹤的檔案呢

解決方式

如果想要解決這個「問題」也很簡單,只要使用下面的程式碼就可以改變 Environment.CurrentDirectory
    
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;
    

這樣改變工作目錄後輸出檔案的相對路徑所在地就會變成執行檔的那層目錄了

參考資料:
Environment.CurrentDirectory Property

留言