當前位置:
首頁 > 知識 > 在運行階段修改應用配置文件

在運行階段修改應用配置文件

上一篇博文中,老周所介紹的自行編寫的配置類,雖然能夠很好地做封裝,但它僅允許修改用戶級別的配置,所以文件都是保存到用戶配置目錄下的。可是,許多情況下,我們還是不考慮用戶隔離,而是能夠直接修改與應用程序同目錄的App.config文件。

那麼,能不能在代碼文件中編輯 app.config 文件呢?當然是可以的。其實,配置文件本質上是個XML文檔,所以,你是可以使用普通XML文件的編輯方式來修改的。但.net類庫還是提供有於讀寫配置文件的專用API,使用專用的API,使得生成的配置比較規範。

.net 的配置文件是由N個配置節組成,每個配置節面向不同的功能,比如 startup 可以配置程序所需要的.net 框架版本。為了便於管理,通常,咱們的應用程序設置都會放到 AppSettings 節上,XML節點為 appSettings。每一條配置都比較簡單,就是由 key 和 value 組成。

要對配置文件進行操作,你記得要引用 System.Configuration.dll 程序集,因為System程序集只包含一些常規的類型,而專用於讀寫配置文件的類型都會包裝到 System.Configuration 程序集中。這些API既適用於app.config,也適用於web.config文件。

好,上面這幾段廢話只要你看懂了,那麼下面我們就可以開始幹活了。放心,很簡單的,老周給你分享的東西,向來都是簡單且有實用價值的。

首先,老周介紹一下大概的類型使用過程。

——讀取 app.config 文件中 appSettings 節中的內容很簡單,使用 ConfigurationManager 類,它公開了兩個靜態屬性,別小看它們,有了這兩個屬性,讀取配置會輕鬆很多。ConnectionStrings:做過資料庫連接的話,你肯定很熟悉它的,這個節點下專門存放連接字元串;AppSettings:這個專門訪問 appSettings 節點下的內容,表示形式很簡潔,就是key - value 對,而且都是字元串類型。

——寫入修改會稍稍複雜一點,但也不是難題。

a、ConfigurationManager類有個靜態方法 OpenExeConfiguration ,你可以指定exe文件路徑,它自動找到匹配的app.config文件,然後打開,返回一個 Configuration 類型的實例。

b、Configuration 類可以對配置文件進行修改,修改完後,可以掉用 Save 方法保存,或調用 SaveAs 方法把配置存到其他文件上。

接下來,老周上一個例子,這個例子運行後,在窗口上可以設置電腦自爆的日期,當窗口關閉時會把這個日期寫入配置文件中的appSettings 節點下。如下圖所示。

在運行階段修改應用配置文件

跟你開個玩笑而已,計算機不會真的爆炸。

通常,我們會在窗口載入時讀出配置文件中的值,以便在界面上顯示用戶上一次設置的內容,不然用戶會誤以為配置丟失。

var q = ConfigurationManager.AppSettings.AllKeys.AsQueryable;
var r = from c in q where c == BOMB_DATE select c;
if (r.Count > 0)
{
string datestr = ConfigurationManager.AppSettings[BOMB_DATE];
picker.SelectedDate = DateTime.Parse(datestr);
}

在讀應用配置前,我用 LINQ 語句查詢了一下,確認我要訪問的設置項是否存在,如果沒有要的設置項,那讀個雞毛。設置節的key是用字元串來表示的,BOMB_DATE是我定義的一個常量。

const string BOMB_DATE = "bombDate";

配置文件中的設置值是以字元串形保存的,而咱們窗口上的控制項需要的是 DateTime 類型的實例,所以讀出來後記得要 Parse 一下。

接下來,我們再看看如何修改並保存 app.config 文件。

先把日期選擇控制項中用戶選擇的日期轉為字元串。

DateTime seldate = picker.SelectedDate ?? DateTime.Today;
string forstr = seldate.ToShortDateString;

然後,還得獲取當前程序的exe路徑。

string exePath = Environment.GetCommandLineArgs[0];

GetCommandLineArgs 方法返回的字元串數組中,第一個元素就是本程序exe的路徑。

調用 ConfigurationManager.OpenExeConfiguration 靜態方法打開app.config文件。

Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);

隨後,是重點部分,就是寫入設置內容。

if (config.AppSettings.Settings.AllKeys.Count(s => s == BOMB_DATE) > 0)
{
// 如果設置項已經存在
// 則直接修改
var kv = config.AppSettings.Settings[BOMB_DATE];
kv.Value = forstr;
}
else
{
// 如果設置項不存在
// 則添加新項
config.AppSettings.Settings.Add(BOMB_DATE, forstr);
}

這裡有個很嚴重的內容,大家一定、必須、特別要注意。得判一下設置項的key是否已存在,因為你如果直接調用 Add 方法添加的話,如果設置項的key已存在,它不是替換整個值,而是會在原來的值後面追加內容。

比如在本例中,要是我寫入了 2017/10/1,第一次保存,因為設置項不存在,所以沒問題。但是,一旦我把值修改為 2017/11/5,然後再保存,那麼設置項的值 就會變為

2017/10/1,2017/11/5

也就是說,新保存的內容不會替換,而是追加,然後用逗號分隔每個值。

如此一來,在讀取的時候就麻煩了,這樣的字元串是不能轉化為 DateTime 實例的。

所以,這裡要先分析一下,如果設置項已經存在,那就通過索引器得到這個設置項的內容,它用一個 KeyValueConfigurationElement 類封裝,其中,Value 屬性是可以修改的(Key不能變,所以只讀),此時,我們只要直接給 Value 屬性賦新的值,那麼保存時就會覆蓋原有的值,而不會在後面追加了。而如果設置項不存在,那太好辦,直接一個Add方法添加就可以了。

最後,修改完了,別忘了保存,不保存的話,是不會寫入app.config文件的。

if (config.AppSettings.SectionInformation.IsLocked)
{
// 如果配置節已鎖定,則放棄保存
return;
}
config.Save(ConfigurationSaveMode.Modified);

保存前檢測 IsLocked 屬性,是看看這個配置節是否被鎖定,如果鎖了,你是不能保存的。

在配置文件中,你可以用這種方法來讓某個節點被鎖定。

<appSettings lockItem="true">
……

</appSettings>

鎖定後,節點就不允許別人編輯了。當然了,你手動打開配置文件是可以改的,我說的是在代碼中用API不能改。

在調用 Configuration 實例的 Save 方法時,可以向方法傳遞一個 ConfigurationSaveMode 枚舉值,這裡我用 Modified,表示只對被修改過的節點進行寫入,這樣做可以省時省力省開銷。

保存後的 app.config 文件的appSettings節點如下。

<appSettings>
<add key="bombDate" value="2017/7/28" />
</appSettings>

=================================================

以上示例的源代碼下載,請點擊?這裡?

怎麼樣,學了後有用吧。差點忘了說,如果你把exe文件放在如 Program Files 等需要管理員許可權的目錄中,你必須以管理員身份運行應用程序才能保存配置文件。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

python數據結構鏈表之單向鏈表
C/C++中static的用法全局變數與局部變數
使用Spring boot + jQuery上傳文件(kotlin)
一步一步學Vue(四)
一種基於kafka+storm實現的日誌記錄方法(二)

TAG:達人科技 |

您可能感興趣

成飛公司「線束自動布線設備工程化應用」取得階段性進展
完成階段目標,滴滴出行成立汽車服務平台
普安供電局完成「掃雷」行動階段性工作目標
滴滴公布階段整改措施
軍委裝備發展部國防知識產權工作取得階段性成績
各階段配速對照表,平時要根據自己的目標配速進行訓練
滴滴公布階段整改措施:順風車下線所有個性化標籤和評論功能
BIM在項目設計階段的應用
航發動力:工業用途燃氣輪機目前在產品試驗階段
監管發聲!行業陷入危機,央行部署下一階段專項整治工作
鞍鋼3D列印用球形鈦合金粉末製備技術攻關取得階段性進展
區塊鏈發展階段及應用場景
備孕階段營養搭配的四個準則
多階段長委託架構模式與應用場景
互金專項整治下一階段方案出爐,平台化解存量風險
發力行業物聯網系統應用,「氦氪」認為現階段競爭核心仍在於速度
滴滴公布階段整改措施順風車服務暫停深夜接單
適用於滲透測試不同階段的工具收集整理
供應鏈金融產品設計階段總結
改變命運的三個階段和狀態