【.net 深呼吸】在運行階段修改應用設定檔

來源:互聯網
上載者:User

標籤:conf   計算   lin   http   價值   web   返回   images   mod   

上一篇博文中,老周所介紹的自行編寫的配置類,雖然能夠很好地做封裝,但它僅允許修改使用者層級的配置,所以檔案都是儲存到使用者配置目錄下的。可是,許多情況下,我們還是不考慮使用者隔離,而是能夠直接修改與應用程式同目錄的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 等需要管理員權限的目錄中,你必須以管理員身份運行應用程式才能儲存設定檔。

 

【.net 深呼吸】在運行階段修改應用設定檔

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.