【C#】取得系統特定資料夾位置

  • 24
  • 0
  • C#
  • 2024-06-19

開發時有時候會需要取得系統目錄,例如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