C# windows winform 程式的設定檔要儲存在哪裡?

筆者在開發和維護的許多軟體是 winform 程式,不是透過安裝,而是整包檔案(執行檔、dll等的發布完後一堆零碎的檔案)直接提供給客戶,透過直接開啟執行檔來執行軟體。而每當軟體需要更新時,就要把設定檔複製出來,複製到新的資料夾內使用,又或是新的程式不要包含設定檔,直接請客戶覆蓋過去,這樣就會直接使用舊的設定檔。

在一開始寫程式的時候,筆者習慣把設定檔放在執行檔旁邊或是子資料夾內,許多程式也是如此,例如 asp.net core, spring boot 等等。但對於 winform 程式,一款使用者在本機使用的軟體來說,或許設定檔還有更好的位置可以用來存放。

依據 Stack Exchange 上這篇 What is "%AppData%"? 中網友提供的說明,在 windows 有兩個環境變數: %AppData% 和 %LocalAppData%,分別對映到的檔案路徑為: C:\Users\ruyut\AppData\Roaming 和 C:\Users\ruyut\AppData\Local 。%AppData% 的資料應該跟隨使用者到不同的裝置(雲端同步設定值),而 %LocalAppData% 則是應該待在本機的資料。

從上述的說明來看,或許把「應用程式」的設定檔儲存在這兩個地方才是比較正確的,而「伺服器相關的服務軟體」的設定檔應該還是讓它繼續待在它原本的位置不要動它比較好。

那要如何知道這兩個檔案位置呢?(不同裝置的路徑會隨者登入系統使用者名稱的不同而改變)直接看程程式碼:
    

        // %AppData%
        var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        Console.WriteLine(appDataPath); // C:\Users\wusnn\AppData\Roaming
        
        // %LocalAppData%
        var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        Console.WriteLine(appDataPath); // C:\Users\wusnn\AppData\Local
    

不過最好建立個資料夾比較好,免得各個應用程式的設定檔混在一起。筆者這裡增加的資料夾名稱為應用程式的名稱
    
        // %AppData%
        var appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Application.ProductName);
        Console.WriteLine(appDataPath); // C:\Users\wusnn\AppData\Roaming\RuyutWinFormsAppExample
        
        // %LocalAppData%
        var localAppData = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), Application.ProductName);
        Console.WriteLine(appDataPath); // C:\Users\wusnn\AppData\Local\RuyutWinFormsAppExample
    

這樣以後要更新應用程式時就不用再很麻煩的請客戶替換設定檔了。

補充:這樣更新檔案的方式使用者有可能不會把舊的軟體刪掉,如果使用者不小心開到舊的版本怎麼辦?或許可以在設定檔內增加個當前版本的欄位,如果使用者開到舊版程式時提醒他

留言