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的文件。

在项目进行编译后,在bin\Debuge文件下,将出现两个配置文件,一个名为“*.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();

//获得配置文件的全路径

string
strFileName=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\[计算机用户名]\LocalSettings\Application Data\[AssemblyCompany("huzongzhe")程序集中的一个属性]\

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

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

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

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

其次,LoadSettings、SaveSettings的位置是C:\Documentsand Settings\[计算机用户名]\LocalSettings\Application 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;
            }
        }
    }
时间: 2024-10-11 00:37:04

C#各种配置文件使用,操作方法总结的相关文章

struts2中struts.xml配置文件详解

struts.xml的常用配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts

C#开发中使用配置文件

C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序在下次运行时可以保留上次的一些设置.同样有时我们希望修改某些设置而不需要重新编译程序,这样也可以通过修改本地配置文件达到目的.之前在网上看到过一篇文章,讲的是小程序或测试类的程序应该追求效率,相关配置完全可以硬编码到代码里,无需写到配置文件里.关于什么属于小程序并没有一个明显的界定,至于要不要写到配

.Net 配置文件——继承ConfigurationSection实现自定义处理类处理自定义配置节点

除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个潜规则: 在配置节点时,对于想要进行存储的参数数据,可以采用两种方式:一种是存储到节点的属性中,另一种是存储在节点的文本中. 因为一个节点可以有很多属性,但是只要一个innertext,而要在程序中将这两种形式区分开会带来复杂性. 为了避免这个问题,.net的配置文件只是用属性存储而不使用inner

配置文件详解和核心api讲解

一.配置文件详解 1.映射文件详解 1.映射配置文件的位置和名称没有限制. -建议:位置:和实体类放在统一目录下.  名称:实体类名称.hbm.xml.    2.在映射配置文件中,标签内的name属性的值要和实体内的属性对应. (1)class标签内的name的值为实体类的全路径. (2)property标签内的name的值为实体类的属性. (3)id标签内的name的值为实体类的属性. (4)id和property标签内的column属性可以不写. (5)id和property标签内有一个t

DotNet程序配置文件

在实际的项目开发中,对于项目的相关信息的配置较多,在.NET项目中,我们较多的将程序的相关配置直接存储的.config文件中,例如web.config和app.config. .NET中配置文件分为两部分:配置的实际内容(位于appSetting节点):指定了节点的处理程序(位于configSections节点). 在.NET程序中,.config文件存储相关配置是以xml格式,如果我们需要对配置文件进行读取和写入,以及相关节点的删除,我们可以直接采用处理xml文件的方式进行操作.也可以采用.N

.Net 配置文件--继承ConfigurationSection实现自定义处理类处理自定义配置节点

除了使用继承IConfigurationSectionHandler的方法定义处理自定义节点的类,还可以通过继承ConfigurationSection类实现同样效果. 首先说下.Net配置文件中一个潜规则: 在配置节点时,对于想要进行存储的参数数据,可以采用两种方式:一种是存储到节点的属性中,另一种是存储在节点的文本中. 因为一个节点可以有很多属性,但是只要一个innertext,而要在程序中将这两种形式区分开会带来复杂性. 为了避免这个问题,.net的配置文件只是用属性存储而不使用inner

spring源码学习之:xml配置文件标签自定义

Spring框架从2.0版本开始,提供了基于Schema风格的XML扩展机制,允许开发者扩展最基本的spring配置文件(一 般是classpath下的spring.xml).试想一下,如果我们直接在spring.xml中加入一个自定义标签<mytag id="aty"></matag>,会发生什么呢?spring框架启动的时候会报错,因为spring根本不认识我们自定义的& lt;mytag>,这样对spring.xml的校验就会失败,最终结果就

nginx配置文件语法高亮显示方法

1.去官方站点下载nginx.vim http://www.vim.org/scripts/script.php?script_id=1886 2.创建nginx.vim的存放目录 # mkdir -pv ~/.vim/syntax 3.将nginx.vim放到~/.vim/syntax目录下 4.创建配置文件 # vim ~/.vim/filetype.vim au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft =

wemall app商城源码中基于PHP的ThinkPHP惯例配置文件代码

wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中关于ThinkPHP惯例配置文件代码,供技术员参考学习. <?php /** * ThinkPHP惯例配置文件 * 该文件请不要修改,如果要覆盖惯例配置的值,可在项目配置文件中设定和惯例不符的配置项 * 配置名称大小写任意,系统会统一转换成小写 * 所有配置参数都可以在生效前动态改变 * @cate