c# winform自定义配置文件

来源:互联网 发布:java开源cms 编辑:程序博客网 时间:2024/06/05 15:48
 

1.配置文件概述: 

  应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。

  常见配置文件模式:

<configuration>

        <configSections>            //配置节声明区域,包含配置节和命名空间声明

              <section>                          //配置节声明

                     <sectionGroup>         //定义配置节组

                            <section>                          //配置节组中的配置节声明

       <appSettings>                   //预定义配置节,针对整个程序的配置

       <Custom element for configuration section>        //配置节设置区域

       <userSetting>                    //针对当前用户的配置

 

2.只有appSettings节的配置文件及访问方法

 

  下面是一个最常见的应用程序配置文件的例子,只有appSettings节。

       <?xml version="1.0" encoding="utf-8"?>

       <configuration>

              <appSettings>

                     <add key="connectionstring" value="User ID=sa;Data Source=.;Password=;

                                                               Initial Catalog=test;Provider=SQLOLEDB.1;" />

                     <add key="TemplatePATH" value="Template" />

              </appSettings>

       </configuration>

 

  下面来看看这样的配置文件如何读取。

       string _connectionString=ConfigurationSettings.AppSettings["connectionstring"];

  使用ConfigurationSettings类的静态属性AppSettings就可以直接读取配置文件中的配置信息。这个属性的类型是NameValueCollection。

 

3.自定义配置文件 

 

3.1 自定义配置节

  一个用户自定义的配置节,在配置文件中分为两部分:一是在<configSections></ configSections>配置节中声明配置节(上面配置文件模式中的“<section>”),另外是在<configSections></ configSections >之后设置配置节(上面配置文件模式中的“<Custom element for configuration section>”),有点类似一个变量先声明,后使用一样。

  声明一个配置文件的语句为:<section name=" " type=" "/> 

  <section>:声明新配置节,即可创建新配置节。

  name:自定义配置节的名称。

  type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、System.Configuration.DictionarySectionHandler、System.Configuration.NameValueSectionHandler。

  不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type。

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

       <configSections>

              <section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>

              <section name="Test2" type="System.Configuration.DictionarySectionHandler"/>

              <section name="Test3" type="System.Configuration.NameValueSectionHandler" />

       </configSections>

    

       <Test1 setting1="Hello" setting2="World"/>

       <Test2>

              <add key="Hello" value="World" />

       </Test2>

       <Test3>

              <add key="Hello" value="World" />

       </Test3>    

</configuration>

 

  对上面的自定义配置节进行说明。

  在声明部分使用<section name="Test1" type="System.Configuration.SingleTagSectionHandler"/>,声明了一个配置节,它的名字叫Test1,类型为SingleTagSectionHandler;在设置配置节部分使用<Test1 setting1="Hello" setting2="World"/>设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配置节和这个类似。 

  下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。

       public static object GetConfig(string sectionName);

  下面是访问这三个配置节的代码:

            //访问配置节Test1

            IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig("Test1");

            string str = (string)IDTest1["setting1"] +" "+(string)IDTest1["setting2"];

            MessageBox.Show(str);        //输出Hello World

 

            //访问配置节Test1的方法2

            string[] values1=new string[IDTest1.Count];

            IDTest1.Values.CopyTo(values1,0);

            MessageBox.Show(values1[0]+" "+values1[1]);    //输出Hello World

            

            //访问配置节Test2

            IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig("Test2");

            string[] keys=new string[IDTest2.Keys.Count];

            string[] values=new string[IDTest2.Keys.Count];

            IDTest2.Keys.CopyTo(keys,0);

            IDTest2.Values.CopyTo(values,0);

            MessageBox.Show(keys[0]+" "+values[0]);

            

            //访问配置节Test3

            NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");

            MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]);    //输出Hello World

 

  通过上面的代码可以看出,不同的type通过GetConfig返回类型不同,具体获得配置内容方式也不一样。 配置节处理程序返回类型分别为: 

       SingleTagSectionHandler   Systems.Collections.IDictionary

       DictionarySectionHandler   Systems.Collections.IDictionary

       NameValueSectionHandler   Systems.Collections.Specialized.NameValueCollection

 

3.2 自定义配置节组 

  配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于<sectionGroup>元素中。下面是一个包含配置节组的配置文件的例子:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

       <configSections>

              <sectionGroup name="TestGroup">

                     <section name="Test" type="System.Configuration.NameValueSectionHandler"/>

              </sectionGroup>

       </configSections>

    

       <TestGroup>

              <Test>

                     <add key="Hello" value="World"/>

              </Test>

       </TestGroup>

</configuration>

 

   下面是访问这个配置节组的代码:

            NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test");

            MessageBox.Show(nc.AllKeys[0].ToString()+" "+nc["Hello"]);    //输出Hello World

 

二.app.config/web.config的增、删、改操作 >>>

 

  配置文件,对于程序本身来说,就是基础和依据,其本质是一个xml文件,对于配置文件的操作,从.NET 2.0 开始,就非常方便了,提供了 System [.Web] .Configuration 这个管理功能的NameSpace,要使用它,需要添加对 System.configuration.dll的引用。 

  对于WINFORM程序,使用 System.Configuration.ConfigurationManager; 

  对于ASP.NET 程序, 使用 System.Web.Configuration.WebConfigurationManager; 

  对于配置文件内容的读取,真是太普遍不过了,我们以最常见的 AppSettings 小节来作为例子。假设有如下的配置文件: 

<?xml version="1.0" encoding="utf-8" ?> 

<configuration> 

       <appSettings> 

              <add key="y" value="this is Y"/> 

       </appSettings> 

</configuration> 

(注意:app.config结构与上面的结构不同,读取方法也不一样)

1. 读取值

       * Asp.Net:System.Web.Configuration.WebConfigurationManager.AppSettings[“y”]; 

       * WinForm:System.Configuration.ConfigurationManager.AppSettings[“y”]; 

2. 添加一项 

       * ASP.NET(需要有写权限):

              Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

              AppSettingsSection app = config.AppSettings; 

              app.Settings.Add("x", "this is X"); 

              config.Save(ConfigurationSaveMode.Modified); 

       * WinForm:

              Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

              AppSettingsSection app = config.AppSettings; 

              app.Settings.Add("x", "this is X"); 

              config.Save(ConfigurationSaveMode.Modified); 

3. 修改一项 

       * Asp.Net:

              Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

              AppSettingsSection app = config.AppSettings; 

              //app.Settings.Add("x", "this is X"); 

              app.Settings["x"].Value = "this is not Y"; 

              config.Save(ConfigurationSaveMode.Modified); 

       * WinForm:

              Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

              AppSettingsSection app = config.AppSettings; 

              //app.Settings.Add("x", "this is X"); 

              app.Settings["x"].Value = "this is not Y"; 

              config.Save(ConfigurationSaveMode.Modified); 

4. 删除一项 

       * Asp.Net:

              Configuration config = WebConfigurationManager.OpenWebConfiguration(null); 

              AppSettingsSection app = config.AppSettings; 

              app.Settings.Remove("x"); 

              config.Save(ConfigurationSaveMode.Modified); 

       * WinForm:

              Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

              AppSettingsSection app = config.AppSettings; 

              app.Settings.Remove("x"); 

              config.Save(ConfigurationSaveMode.Modified);



三.上机操作[vs2005] >>>



1.向项目添加app.config文件: 

  右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“app.config”,单击“确定”。出现在设计器视图中的app.config文件为: 

  <?xmlversion="1.0"encoding="utf-8" ?> 

  <configuration> 

  </configuration> 

  在项目进行编译后,在bin/Debuge文件下,将出现两个配置文件(以本项目为例),一个名为“XXX.EXE.config”,另一个名为“XXX.vshost.exe.config”。第一个文件为项目实际使用的配置文件,在程序运行中所做的更改都将被保存于此;第二个文件为原代码“app.config”的同步文件,在程序运行中不会发生更改。 

 

2.connectionStrings配置节: 

  请注意:如果您的SQL版本为2005 Express版,则默认安装时SQL服务器实例名为localhost/SQLExpress,须更改以下实例中“Data Source=localhost;”一句为“Data Source=localhost/SQLExpress;”,在等于号的两边不要加上空格。 

  <!--数据库连接串--> 

  <connectionStrings> 

          <clear /> 

          <add 

connectionString="Data Source=localhost;Initial Catalog=jxcbook;

                      User ID=sa;password=********" 

provider /> 

  </connectionStrings> 

 

3.appSettings配置节: 

  appSettings配置节为整个程序的配置,如果是对当前用户的配置,请使用userSettings配置节,其格式与以下配置书写要求一样。 

  <!--进销存管理系统初始化需要的参数--> 

  <appSettings> 

  <clear /> 

  <add key="userName" value="" /> 

  <add key="password" value="" /> 

  <add key="Department" value="" /> 

  <add key="returnValue" value="" /> 

  <add key="pwdPattern" value="" /> 

  <add key="userPattern" value="" /> 

  </appSettings> 

 

4.读取与更新app.config 

  对于app.config文件的读写,参照“Read/Write App.Config File with .NET 2.0”一文

【点我进入

。 

  请注意:要使用以下的代码访问app.config文件,除添加引用System.Configuration外,还必须在项目添加对System.Configuration.dll的引用。 

 

4.1 读取connectionStrings配置节 

  ///<summary> 

  ///依据连接串名字connectionName返回数据连接字符串 

  ///</summary> 

  private static string GetConnectionStringsConfig(string connectionName) 

  { 

              string connectionString = 

                        ConfigurationManager.ConnectionStrings[connectionName].ConnectionString.ToString(); 

              Console.WriteLine(connectionString); 

              return connectionString; 

       } 

4.2 更新connectionStrings配置节 

  ///<summary> 

  ///更新连接字符串 

  ///</summary> 

  ///<param >连接字符串名称</param> 

  ///<param >连接字符串内容</param> 

  ///<param >数据提供程序名称</param> 

  private static void UpdateConnectionStringsConfig

                                          (string newName, string newConString, string newProviderName) 

  { 

         bool isModified = false;             //记录该连接串是否已经存在 

         //如果要更改的连接串已经存在 

         if (ConfigurationManager.ConnectionStrings[newName] != null) 

         { 

                isModified = true; 

            } 

          //新建一个连接字符串实例 

          ConnectionStringSettings mySettings = 

          new ConnectionStringSettings(newName, newConString, newProviderName); 

          // 打开可执行的配置文件*.exe.config 

          Configuration config = 

                               ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

          // 如果连接串已存在,首先删除它 

          if (isModified) 

          { 

                 config.ConnectionStrings.ConnectionStrings.Remove( newName); 

          } 

          // 将新的连接串添加到配置文件中. 

          config.ConnectionStrings.ConnectionStrings.Add(mySettings); 

          // 保存对配置文件所作的更改 

          config.Save(ConfigurationSaveMode.Modified); 

          // 强制重新载入配置文件的ConnectionStrings配置节 

          ConfigurationManager.RefreshSection("connectionStrings"); 

  } 

 

4.3 读取appStrings配置节 

  ///<summary> 

  ///返回*.exe.config文件中appSettings配置节的value项 

  ///</summary> 

  private static string GetAppConfig(string strKey) 

  { 

          foreach (string key in ConfigurationManager.AppSettings) 

          { 

                 if (key == strKey) 

                 { 

                        return ConfigurationManager.AppSettings[strKey]; 

                 } 

          } 

          return null; 

  } 

 

4.4 更新connectionStrings配置节 

  ///<summary> 

  ///在*.exe.config文件中appSettings配置节增加一对键、值对 

  ///</summary> 

  private static void UpdateAppConfig(string newKey, string newValue) 

  { 

          bool isModified = false; 

          foreach (string key in ConfigurationManager.AppSettings) 

          { 

                 if(key==newKey) 

                 { 

                        isModified = true; 

                 } 

          } 

          // Open App.Config of executable 

          Configuration config = 

                               ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

          // You need to remove the old settings object before you can replace it 

          if (isModified) 

          { 

                 config.AppSettings.Settings.Remove(newKey); 

          } 

          // Add an Application Setting. 

          config.AppSettings.Settings.Add(newKey,newValue); 

          // Save the changes in App.config file. 

          config.Save(ConfigurationSaveMode.Modified); 

          // Force a reload of a changed section. 

          ConfigurationManager.RefreshSection("appSettings") ; 

  } 

 

5.加密配置文件 

  此节代码参照Dariush Tasdighi所著文章《Encrypt and Decrypt of ConnectionString in app.config and/or web.config!》【点我进入】。 

  请注意:(1)要使用以下的代码访问app.config文件,除添加引用System.Configuration外,还必须在项目添加对System.Configuration.dll的引用; (2)以下示例代码中的DPAPI提供程序为“DataProtectionConfigurationProvider”,这是一种基于机器名和当前用户密码的加密方式。如果计划在多台服务器(Web 场合)上使用相同的加密配置文件,则只有通过 RSAProtectedConfigurationProvider 才能导出加密密钥,并将其导入其他服务器。(3)加密后的配置文件不需要解密即可用上述方法直接读取。 

 

5.1 加密connectionStrings配置节 

  ///<summary> 

  ///加密配置文件中的ConnectionString节 

  ///</summary> 

  ///<param >true为加密,false为解密</param> 

  public static void ConnectionStringProtection( bool protect) 

  { 

          //取得当前程序的执行路径 

          string pathName = Application.ExecutablePath; 

          // 定义Dpapi提供程序的名称. 

          string strProvider = "DataProtectionConfigurationProvider"; 

          System.Configuration.Configuration oConfiguration = null; 

          System.Configuration.ConnectionStringsSection oSection = null; 

          try 

          { 

                 // 打开配置文件,并取得connectionStrings配置节. 

                 oConfiguration = 

                               System.Configuration.ConfigurationManager.OpenExeConfiguration(

<param>

true为加密,false为解密</param> );

                 public static void AppSettingProtection(bool protect) 

                 { 

                        //取得当前程序的执行路径 

                        string pathName = Application.ExecutablePath; 

                        // Define the Dpapi provider name. 

                        string strProvider = "DataProtectionConfigurationProvider"; 

                        System.Configuration.Configuration oConfiguration = null; 

                        System.Configuration.AppSettingsSection oSection = null; 

                        try 

                        { 

                               // Open the configuration file and retrieve the connectionStrings section. 

                               oConfiguration = 

                                             System.Configuration.ConfigurationManager.OpenExeConfiguration(pathName); 

                               if (oConfiguration != null) 

                               { 

                                      bool blnChanged = false; 

                                      oSection = oConfiguration.GetSection("appSettings") as 

                                                                                System.Configuration.AppSettingsSection; 

                                      if (oSection != null) 

                                      { 

                                             if ((!(oSection.ElementInformation.IsLocked)) 

                                                                         &&(!(oSection.SectionInformation.IsLocked))) 

                                             { 

                                                    if (protect) 

                                                    { 

                                                           if (!(oSection.SectionInformation.IsProtected)) 

                                                           { 

                                                                  blnChanged = true; 

                                                                  // Encrypt the section. 

                                                                  oSection.SectionInformation.ProtectSection(strProv ider); 

                                                           } 

                                                    } 

                                                    else 

                                                    { 

                                                           if (oSection.SectionInformation.IsProtected) 

                                                           { 

                                                                  blnChanged = true; 

                                                                  // Remove encryption. 

                                                                  oSection.SectionInformation.UnprotectSection(); 

                                                           } 

                                                    } 

                                             } 

                                             if (blnChanged) 

                                             { 

                                                    // Indicates whether the associated configuration section will be saved even 

                                                    // if it has not been modified. 

                                                    oSection.SectionInformation.ForceSave = true; 

                                                    // Save the current configuration. 

                                                    oConfiguration.Save(); 

                                               } 

                                      } 

                               } 

                        } 

                        catch (System.Exception ex) 

                        { 

                               throw (ex); 

                        } 

                     }

          finally 

          { 

          } 

     } 

原创粉丝点击