• C#各种配置文件使用,操作方法总结


    配置文件操作

        配置文件一般分为内置配置文和用户自定义配置文件。

        内置配置文件包括app.config、web.config、Settings.settings等等。

    用户自定义配置文件一般是将配置信息放到XML文件或注册表中,配置信息一般包括程序设置,记录运行信息,保存控件的信息(比如位置,样式)。

    一、内置配置文件操作

    app.config和web.config操作类似,以app.config为例,Settings.settings能够指定值的类型和范围。

    1.app.config文件操作

    该配置文件中主要的节点有:connectionStrings、appSettings、configSections等,这几个属于常用,操作都略有不同,DotNet提供直接操作各个节点的方法。在用到ConfigurationManager时要添加system.configuration.dll程序集的引用。

    程序移植后配置文件的修改会保存在.exe.config的文件中,但是根据我经验如果你不修改配置文件,一般exe不自动创建一个.exe.config的文件。

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

     

    connectionStrings:由于保存数据连接字符串。

    读:

    ConfigurationManager.ConnectionStrings["AccessDB"].ConnectionString;

    写:

    //设置连接字符串
    
    ConnectionStringSettings setConnStr = newConnectionStringSettings("AccessDB", connectionString,"System.Data.OleDb");
    
    //打开当前应用程序的app.config文件,进行操作
    
    Configuration appConfig =ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    
    //由于没有更新连接字符串的方法,所以这里直接再添加一个连接字符串
    
    appConfig.ConnectionStrings.ConnectionStrings.Add(setConnStr);
    
    appConfig.Save();
    
    // 强制重新载入配置文件的ConnectionStrings配置节
    
    ConfigurationManager.RefreshSection("connectionStrings");


    appSettings:主要存储程序设置,以键值对的形式出现。

    读:

    String str = ConfigurationManager.AppSettings["DemoKey"];

    写:

    Configuration cfg=ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    
    cfg.AppSettings.Settings["DemoKey"].Value= "DemoValue";
    
    cfg.Save();

    configSections:自定义配置节

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

    type:自定义配置节的类型,主要包括:

    System.Configuration.SingleTagSectionHandler

    System.Configuration.DictionarySectionHandler

    System.Configuration.NameValueSectionHandler。

    不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。

    三个不同的type操作:

    <?xmlversion="1.0" encoding="utf-8" ?>
    
    <configuration>
    
         <configSections>
    
             <sectiontype="System.Configuration.SingleTagSectionHandler"/>
    
             <sectiontype="System.Configuration.DictionarySectionHandler"/>
    
             <sectiontype="System.Configuration.NameValueSectionHandler" />
    
         </configSections>
    
         <Test1 setting1="Hello"setting2="World"/>
    
         <Test2>
    
             <add key="Hello"value="World" />
    
         </Test2>
    
         <Test3>
    
             <add key="Hello"value="World" />
    
         </Test3>   
    
    </configuration>


     

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

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

    //访问配置节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]);     //输出HelloWorld
    
    //访问配置节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
    
    NameValueCollectionnc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");
    
    MessageBox.Show(nc.AllKeys[0].ToString()+""+nc["Hello"]); //输出HelloWorld

    配置节处理程序

    返回类型

    SingleTagSectionHandler

    Systems.Collections.IDictionary

    DictionarySectionHandler

    Systems.Collections.IDictionary

    NameValueSectionHandler

    Systems.Collections.Specialized.NameValueCollection

     

    sectionGroup:自定义配置节组

    配置节组是使用<sectionGroup>元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的

    包含元素,在<configSections>元素中声明配置节组,并将属于该组的节置于<sectionGroup>元素中。下面

    是一个包含配置节组的配置文件的例子:

    <?xml version="1.0"encoding="utf-8" ?>
    
    <configuration>
    
         <configSections>
    
            <sectionGroup >
    
                <section type="System.Configuration.NameValueSectionHandler"/>
    
            </sectionGroup>
    
         </configSections>
    
      
    
         <TestGroup>
    
            <Test>
    
                <add key="Hello" value="World"/>
    
            </Test>
    
         </TestGroup>
    
    </configuration>


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

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

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

     

    2.Settings.settings配置文件操作

     这个用的不多,操作也很简单,在此不详细叙述。

     

    二、用户自定义文件操作

    1.XML配置文件操作

    XML配置文件一般由我们自己定义格式,由于某些地方对于app.config不提供写的功能,我们就需要自己来操作这个XML,这里我们就拿它作为例子,来说明XML的操作。

    privatevoid SaveConfig(string ConnenctionString)
            
    {
                 XmlDocument doc=new XmlDocument();
                
    //获得配置文件的全路径
                 stringstrFileName=AppDomain.CurrentDomain.BaseDirectory.ToString()+"Code.exe.config";
                
    doc.LOAd(strFileName);
                 //找出名称为“add”的所有元素
                XmlNodeList nodes=doc.GetElementsByTagName("add");
                
    for(int i=0;i<nodes.Count;i++)
                
    {
                     //获得将当前元素的key属性
                     XmlAttributeatt=nodes[i].Attributes["key"];
                    
    //根据元素的第一个属性来判断当前的元素是不是目标元素
                     if (att.Value=="ConnectionString")
                    
    {
                         //对目标元素中的第二个属性赋值
                        att=nodes[i].Attributes["value"];
                        
    att.Value=ConnenctionString;
                         break;
                    
    }
                 }
                 //保存上面的修改
                doc.Save(strFileName);
             }

     

    2.注册表配置操作

    首先注册表也是以键值对的形式存储的,DotNet提供对注册表的操作。

    操作实例:

          

             <span style="font-size:12px;">/// <summary>
            /// 从注册表中加载窗体位置大小等信息
            /// </summary>
            public static voidLoadFormPosition(System.Windows.Forms.Form Fo)
            {
                Microsoft.Win32.RegistryKey rk =Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\MapWinGISConfig",false);
                try
                {
                    if ((rk.GetValue(Fo.Name +"_x").ToString() != "") && (rk.GetValue(Fo.Name +"_y").ToString()!= "") && (rk.GetValue(Fo.Name + "_w").ToString()!= "") && (rk.GetValue(Fo.Name+ "_h").ToString() != ""))
                    {
                        Fo.Location = newSystem.Drawing.Point(int.Parse(rk.GetValue(Fo.Name +"_x").ToString(),CultureInfo.InvariantCulture), int.Parse(rk.GetValue(Fo.Name +"_y").ToString(),CultureInfo.InvariantCulture));
    
                        Fo.Size = newSystem.Drawing.Size(int.Parse(rk.GetValue(Fo.Name +"_w").ToString(),CultureInfo.InvariantCulture), int.Parse(rk.GetValue(Fo.Name +"_h").ToString(),CultureInfo.InvariantCulture));
                    }
                }
                catch
                {
                }
                finally
                {
                    rk.Close();
                }
            }
            /// <summary>
            /// 将窗体位置大小信息保存在注册表中
           /// </summary>
            public static voidSaveFormPosition(System.Windows.Forms.Form Fo)
            {
                Microsoft.Win32.RegistryKey rk =Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\\MapWinGISConfig");
    
                if (Fo.Visible &&Fo.WindowState != System.Windows.Forms.FormWindowState.Minimized&&Fo.Location.X > -1 && Fo.Location.Y > -1 && Fo.Size.Width> 1 && Fo.Size.Height > 1)
                {
                    rk.SetValue(Fo.Name +"_x", Fo.Location.X);
                    rk.SetValue(Fo.Name +"_y", Fo.Location.Y);
                    rk.SetValue(Fo.Name +"_w", Fo.Size.Width);
                    rk.SetValue(Fo.Name +"_h", Fo.Size.Height);
                }
                rk.Close();
            }</span>

    三、应用程序信息配置

    通过代码继承ApplicationSettingsBase类(C/S模式),在代码中设置相关的属性。

       1.继承该类一般有类属性[SettingsProvider("System.Configuration.LocalFileSettingsProvider")]-详情如下

       2.每个属性必须设置是[ApplicationScopedSetting()]还是[UserSocpedSetting()],还可以设置默认值[DefaultSettingValueAttribute("100,100")]

       3.属性设置完成后,在方法级别或方法内部(视情况而定)实例化该继承的类,在窗体加载时设置相应属性。加载程序配置方法有两种-详情如下。

       4.如果需要可以利用事件监视设置的属性改变、保存、加载时进行哪些操作

       5.在窗体注销时保存设置。

    详解:

     (一),LocalFileSettingsProvider---为应用程序设置类提供持久性存储。

         1.该类提供一种机制--程序使用配置数据的机制,其将程序的设置文件保存到默认的位置。

         2.客户端并不显示访问这个类,而是在需要服务时由设置机制自动调用,如:ApplicationSettingsBase中的很多成员都使用该类。

         3.该类将配置文件保存为.config的XML文件

             1.若字段的属性设置为[UserScopedSetting()],则保存为user.config文件,

               保存位置C:Documentsand Settings[计算机用户名]LocalSettingsApplication Data[AssemblyCompany("huzongzhe")程序集中的一个属性]

             2.若字段的属性设置为[ApplicationScopedSetting()],则保存为[程序名].exe.config文件,

               保存位置:与可执行文件相同的目录中。

        4.ToolStripManager.LoadSettings(this)和ToolStripManager.SaveSettings(this)方法解释

           首先,ToolStripManager提供Toolstrip相关类型的一些操作,包括合并,拆分toolstrip、呈现样式、保存加载设置。

           其次,LoadSettings、SaveSettings的位置是C:Documentsand Settings[计算机用户名]LocalSettingsApplication Data[AssemblyCompany("huzongzhe")程序集中的一个属性]

                 与LocalFileSettingsProvider提供的文件配置是同一个位置,并且是同一个文件。  

          最后,LoadSettings的内容:Size、IsDefault、ItemOrder、Visible、ToolStripPanelName、Name、Location等7个属性。

     

     

     (二),加载程序配置方法

         1.通过函数Binding来绑定,这样在程序加载时直接与配置文件的数据绑定,并且可以在值改变时直接加载到XML中。

               Binding bndBackColor = new Binding("BackColor", frmSettings1,

                   "FormBackColor", true,DataSourceUpdateMode.OnPropertyChanged);

               this.DataBindings.Add(bndBackColor);

     

         2.通过提取的方法。这样每次修改后不能动态改变,需要手动设置。

          this.Size = frmSettings1.FormSize;

     (三),[SettingsGroupName("System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm")]类属性

         设置每个Toolstrip的前缀名,即每个组的前面限定名

         例如:tlbZoom工具条在配置文件中的标识-->System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm.tlbZoom

     

     (四),方法Reload();Reset();Save(); Upgrade();

           Reload()方法从配置文件重新加载值。

          Reset() 方法将设置重置为默认值。

           Save() 方法保存当前设置的值。

          Upgrade()更新程序设置值。

     

    代码示例:

     [SettingsProvider("System.Configuration.LocalFileSettingsProvider")]
     [SettingsGroupName("System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm")]
        sealedclass ToolStripSettings : ApplicationSettingsBase
        {
           public ToolStripSettings(string settingsKey) : base(settingsKey)//传过来的是toolstrip的Name属性
            {
            }
    
           [UserScopedSetting()]
           public System.Drawing.Point Location
            {
               get
                {
                   if (this["Location"] == null)
                    {
                       if (this.GetPreviousVersion("Location") == null)
                       {
                            return newSystem.Drawing.Point(-1, -1);
                       }
                       return ((System.Drawing.Point)(this.GetPreviousVersion("Location")));
                   }
                   return ((System.Drawing.Point)(this["Location"]));
                }
    
              set
                {
                   this["Location"] = value;
                }
            }
    
           [UserScopedSetting(), DefaultSettingValue("StripDocker.Top")]
           public string ToolStripPanelName
            {
               get
                {
                   if(string.IsNullOrEmpty((string)(this["ToolStripPanelName"])))
                   {
                       // 设置早期设置的值
                        if(string.IsNullOrEmpty((string)(this.GetPreviousVersion("ToolStripPanelName"))))
                       {
                           // 默认值
                           return string.Empty;
                       }
                       return ((string)(this.GetPreviousVersion("ToolStripPanelName")));
                   }
                   return ((string)(this["ToolStripPanelName"]));
                }
              set
                {
                   this["ToolStripPanelName"] = value;
                }
            }
    
           [UserScopedSetting()]
           [DefaultSettingValue("ImageAndText")]
           public string DisplayStyle
            {
               get
                {
                   const string defaultValue = "ImageAndText";
                   if (this["DisplayStyle"] == null ||((string)(this["DisplayStyle"])) ==string.Empty)
                 {
                       // 设置早期值
                       if (this.GetPreviousVersion("DisplayStyle") == null ||((string)(this.GetPreviousVersion("DisplayStyle")))== string.Empty)
                        {
                            // 默认值
                            return defaultValue;
                       }
                       return ((string)(this.GetPreviousVersion("DisplayStyle")));
                   }
                   return ((string)(this["DisplayStyle"]));
                }
               set
                {
                   this["DisplayStyle"] = value;
                }
            }
        }
    生命不止,奋斗不息!
  • 相关阅读:
    01_根据Id查询User的数据
    rest_framework常用设置
    django AnonymousUser
    获取视频时长和文件大小
    xadmin增加用户 除了账号和密码 添加其他信息
    Django 重写用户模型
    xadmin 常见错误
    Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'
    xadmin设置
    python3安装xadmin出现 UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 3444: illegal multibyte sequence
  • 原文地址:https://www.cnblogs.com/huzongzhe/p/6735190.html
Copyright © 2020-2023  润新知