開發時有時候會需要取得系統目錄,例如system32, 桌面 等等的路徑。最直覺的方式就是寫死在程式或是設定檔。但如果相同的程式需要發佈到不同的主機上,就有機會遇到抓取路徑錯誤的問題。幸好C# 很貼心的提供強行別作法,可以取得特別的目錄
透過 Environment.GetFolderPath
,有兩種多載:
Environment.GetFolderPath(Environment.SpecialFolder folder);
Environment.GetFolderPath(Environment.SpecialFolder folder, Environment.SpecialFolderOption option);
主要決定路徑的列舉Environment.SpecialFolder
有什麼種類,可以參考以下連結
Environment.SpecialFolder 列舉 (System) | Microsoft Learn
兩種多載的差別在於,上面單一參數的方法,當路徑不存在時,就會直接回傳空字串;若是下面兩個參數的方法,可以另外指定option 檢查路徑的存在,甚至直接建立路徑。
寫了一個簡單程式測試第二種多載
[Test]
public void EnvironmentTest()
{
for (int i = 0; i < 60; i++)
{
if (Enum.IsDefined(typeof(Environment.SpecialFolder), i))
{
var path = Environment.GetFolderPath((Environment.SpecialFolder)i);
if (string.IsNullOrEmpty(path))
{
// 當列舉的系統目錄不存在,用第二種多載create
path = Environment.GetFolderPath((Environment.SpecialFolder)i, Environment.SpecialFolderOption.Create);
// 測試結果: 列舉Environment.SpecialFolder.LocalizedResources 不存在
// 經由第二種多載create 目錄: C:\Windows\resources\0404
}
}
}
}
至於Environment.SpecialFolderOption
有三種
Create | 目錄不存在則Create |
DoNotVerify | 不驗證目錄是否存在,如果目標是網路路徑,可以減少透過網路檢查路徑步驟,節省時間。 |
None | 預設行為,如同第一個多載,目錄存在才會回傳路徑。 |
References:
Environment.GetFolderPath 方法 (System) | Microsoft Learn
https://dotblogs.com.tw/chou/archive/2009/04/12/7986.aspx#P009