您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net重在是应用程序的布置文件,操作方

新葡亰496net重在是应用程序的布置文件,操作方

发布时间:2019-11-30 06:12编辑:奥门新萄京娱乐场浏览(147)

    项目添加引用System.Configuration.dll,using System.Configuration;

    首先假设你的应用程序配置文件如下:

    配置文件操作

        很想写这么一篇心得,因为我前段时间一直在搞系统的自动更新,不得不跟这个XML文档打交道,在整个的学习过程中,有点收获,这里记下来,算是共享。
        在.net中,操纵XML文档很容易,而且获取一个文档或者一个节点的方法很多,用一句话来形容就是:没有最好的,只有最合适的。所以我们应该掌握更多的方法以适应不同的场合,在这里我总结得肯定不够完善,希望大家多多指点,因为还有些我自己也不是很明白。今天的事例主要是以一个简单的配置文件为例,下面为appstart.exe.config文件:

    在.Net中提供了配置文件,让我们可以很方面的处理配置信息,这个配置是XML格式的。而且.Net中已经提供了一些访问这个文件的功能。
    
    1、读取配置信息
    下面是一个配置文件的具体内容:
    <!-- 此处显示用户应用程序和配置的属性设置。-->
    <!-- 示例: -->
    <add key="coal" value="一二三" />
    <add key="inWellTime" value="5" />
    
    .Net提供了可以直接访问(注意大小写)元素的方法,在这元素中有很多的子元素,这些子元素名称都是“add”,有两个属性分别是“key”和“value”。一般情况下我们可以将自己的配置信息写在这个区域中,通过下面的方式进行访问:
    
    String ConString=System.Configuration.ConfigurationSettings.AppSettings["inWellTime"];
    
    在AppSettings后面的是子元素的key属性的值,例如AppSettings["inWellTime"],我们就是访问这个子元素,它的返回值就是“5”,即value属性的值。
    
    2、设置配置信息
    新葡亰496net,新葡亰496net重在是应用程序的布置文件,操作方法总括。如果配置信息是静态的,我们可以手工配置,要注意格式。如果配置信息是动态的,就需要我们写程序来实现。在.Net中没有写配置文件的功能,我们可以使用操作XML文件的方式来操作配置文件。
    
    写了个WinForm中读写配置文件App.config的类
    代码如下:
    

    应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。

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

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

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="appStart" type="Microsoft.ApplicationBlocks.ApplicationUpdater.AppStart.ConfigSectionHandler,AppStart" />
      </configSections>
      <appStart>
        <ClientApplicationInfo>
          <appFolderName>C:Program FilesMyApp1.0.0.0bin</appFolderName>
          <appExeName>AppGSGW.exe</appExeName>
          <installedVersion>1.0.0.0</installedVersion>
          <lastUpdated>2004-1-1</lastUpdated>
        </ClientApplicationInfo>
      </appStart>
    </configuration>

    using System;
    using System.Configuration;
    using System.Xml;
    using System.Data;

    configuration是根节点,我们经常访问的是appSettings,它是由.Net预定义配置节所有的配置项都在<configuration>标签下面

    <configuration>

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

    首先简要说明下配置文件中一些节点代表的含义:ClientApplicationInfo代表一个客户端安装的一些版本信息和应用程序
    要执行的一些信息,包括版本号,可执行文件名,安装路径和最后更新日期。

    namespace a05
    {
        /// ConfigClass 的摘要说明。
        ///
        public class ConfigClass
        {
            public string strFileName;
            public string configName;
            public string configValue;
            public ConfigClass()
            {
                //
                // TODO: 在此处添加构造函数逻辑
                //
            }
            public string ReadConfig(string configKey)
            {
                configValue = "";
                configValue = ConfigurationSettings.AppSettings["" configKey ""];
                return configValue;
            }

    <connectionStrings>节点,专门用于配置数据库连接字符串。它下面可以使用<Add>节点来添加多个数据库连接字符串。形如:

      <appSettings>

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

            是标准的 XML 文件。.NET Framework 定义了一组实现配置设置的元素。一个应用程序配置文件包含应用程序特定的设置。该文件包含公共语言运行库读取的配置设置(如程序集绑定策略、远程处理对象等等),以及应用程序可以读取的设置。

            //得到程序的config文件的名称以及其所在的全路径
            public void SetConfigName(string strConfigName)
            {
                configName = strConfigName;
                //获得配置文件的全路径
    新葡亰496net重在是应用程序的布置文件,操作方法总括。            GetFullPath();
            }
            public void GetFullPath()
            {
                //获得配置文件的全路径
                strFileName = AppDomain.CurrentDomain.BaseDirectory.ToString() configName;
            }
            public void SaveConfig(string configKey, string configValue)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(strFileName);
                //找出名称为“add”的所有元素
                XmlNodeList nodes = doc.GetElementsByTagName("add");
                for (int i = 0; i < nodes.Count; i )
                {
                    //获得将当前元素的key属性
                    XmlAttribute att = nodes[i].Attributes["key"];
                    //根据元素的第一个属性来判断当前的元素是不是目标元素
                    if (att.Value == "" configKey "")
                    {
                        //对目标元素中的第二个属性赋值
                        att = nodes[i].Attributes["value"];
                        att.Value = configValue;
                        break;
                    }
                }
                //保存上面的修改
                doc.Save(strFileName);
            }
        }
    }

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <configuration>
     3     <connectionStrings>
     4         <add name="conn" connectionString="this is connection string"/>
     5     </connectionStrings>
     6     <appSettings>
     7         <add key="key1" value="value1" />
     8         <add key="key2" value="value2" />
     9     </appSettings>
    10 </configuration>
    
     1 // ConfigurationManager.ConnectionStrings是一个ConnectionStringSettingsCollection对象
     2 //获取每个连接字符串,每个ConnectionStringSettings对象有Name和ConnectionString属性
     3 for (int i = 0; i < ConfigurationManager.ConnectionStrings.Count; i  )
     4 {
     5     string name = ConfigurationManager.ConnectionStrings[i].Name;
     6     string connectionString = ConfigurationManager.ConnectionStrings[i].ConnectionString;
     7     Console.WriteLine(i.ToString()   ". "   name   " = "   connectionString);
     8 }//每个ConnectionStringSettings对象有Name和ConnectionString属性
     9 foreach (ConnectionStringSettings conn in ConfigurationManager.ConnectionStrings)
    10 {
    11     string name = conn.Name;
    12     string connectionString = conn.ConnectionString;
    13     Console.WriteLine(name   " = "   connectionString);
    14 }
    15 
    16 //AppSettings是NameValueConnection类型,使用AllKeys返回一个所有Key组成的字符串数组
    17 string[] keys = ConfigurationManager.AppSettings.AllKeys;
    18 for (int i = 0; i < keys.Length; i  )
    19 {
    20     string key = keys[i];
    21     //通过Key来索引Value
    22     string value = ConfigurationManager.AppSettings[key];
    23     Console.WriteLine(i.ToString()   ". "   key   " = "   value);
    24 }
    

        <add key="name" value="old"/>

    一、内置配置文件操作

    一:怎样获取该配置文档?
            1.
            在VS中获取配置文档有直接提供的方法。首先我们必须知道应用程序配置文件所在的路径,这个对我们理解很有好处,应用程序配置文件的名称和位置取决于应用程序的宿主,如果是可执行文件承载的应用程序,则由可执行文件宿主承载的应用程序的配置文件与该应用程序位于同一目录。配置文件的名称是带有 .config 扩展名的该应用程序的名称。例如,名为 myApp.exe 的应用程序可以与名为 myApp.exe.config 的配置文件关联。 我们可以用如下方式获取该配置文件:
                 
                XmlDocument doc = new XmlDocument();
                doc.Load( AppDomain.CurrentDomain.SetupInformation.ConfigurationFile );

     

    修改配置文件:

      </appSettings>

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

            2.
          既然知道了应用程序的路径而且也知道了配置文件的路径方法就多了。
            首先可以直接加载路径,即静态获取,XmlDocument dd = new XmlDocument();     dd.Load("C:aabb\app.exe.config");
            其次如果要动态获取的话可以这样,string p = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),然后在加载就行了。获取程序集的路径方法多,就不一一例出来了。

    
    应用如下:
    读取:
    ConfigClass config = new ConfigClass();
    string coal = config.ReadConfig("coal");
    this.tbOpenFile.Text = config.ReadConfig("inWellTime");

      错误方法:

    </configuration>

    1.app.config文件操作

    二:获取/修改配置文档节点

    写:
    ConfigClass config = new ConfigClass();
    //得到程序的config名:DataOperate.exe.config;
    config.SetConfigName("DataOperate.exe.config");
    config.SaveConfig("coal","三二一");
    config.SaveConfig("inWellTime","10");

     1 private void AccessAppSettings()
     2 {
     3     //获取Configuration对象
     4     Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
     5     //根据Key读取<add>元素的Value
     6     string name = config.AppSettings.Settings["name"].Value;
     7     //写入<add>元素的Value
     8     config.AppSettings.Settings["name"].Value = "fx163";
     9     //增加<add>元素
    10     config.AppSettings.Settings.Add("url", "http://www.fx163.net");
    11     //删除<add>元素
    12     config.AppSettings.Settings.Remove("name");
    13     //一定要记得保存,写不带参数的config.Save()也可以
    14     config.Save(ConfigurationSaveMode.Modified);
    15     //刷新,否则程序读取的还是之前的值(可能已装入内存)
    16     System.Configuration.ConfigurationManager.RefreshSection("appSettings");
    17 }
    
     虽然程序运行时的值已经被修改。但是打开app.config查看,会看到值仍然没有被改动。如果重启程序,就会使用以前的旧值。用这种方法只可以读取值。不能写入或者修改值。
    

     

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

            如果我们要获取上面的ClientApplicationInfo节点列表,可以用doc.GetElementsByTagName("ClientApplicationInfo");返回的将是一个xmlnodelist对象nodelist,而如果我们要获取<appExeName>节点我们就可以这样,nodelist.SelectSingleNode(@"descendant::appExeName")或者nodelist.SelectSingleNode("ClientApplicationInfo/appExeName"),xmlNodeList和XMLNode有很多方法和属性来对文档进行操作,比如我们要修改appExeName节点的属性,我们可以这样:
                XmlNode node = myDoc.SelectSingleNode("configuration/ClientApplicationInfo/appExeName");
                node.InnerText = “新内容”;
    获取它的内容就是相反的操作就行了。

    注意:当修改完App.config。文件后,程序中用到的App.config文件的“key”对应的“value”值需要重读,否则修改后修改并不能立即起作用,而要等下次程序重启后才可以读取到修改后的App.config属性值。 

       正确方法:把配置文件按照普通的xml文件来进行修改,否则,经常出现的问题就是你所修改的东西其实最后根本没有写入文件!

    Ok,那么如何在运行时去修改name的值呢??

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

    三:保存配置文件
            1.获取配置文件路径(如上面得到的p路径);
            2.调用XmlDocument类的save(p)方法.

    一般配置文件就在跟可执行exe文件在同一目录下,且仅仅在名称后面添加了一个.config 因此,可以用Application.ExecuteablePath ".cofig"的方式来获得,不过更加推荐使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile这句话来直接获取当前程序的配置文件的位置,具体原因,后面再叙述。

    有很多童鞋会说可以使用Xml读取配置文件,然后xxx。。。。

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

    总结:在我自己的使用过程中,我就觉得这三种操作最频繁,首先是获取文件,然后就是操作,修改什么的,最后就是保存了。有更好意见的或者我有不全面的地方,请多多指点,共同提高,谢谢。                                                                                     

     1 using System.Xml;  
     2 //第一个参数是xml文件中的add节点的value,第二个参数是add节点的key  
     3 private void SaveConfig(string ConnenctionString, string strKey)  
     4 {  
     5             XmlDocument doc = new XmlDocument();  
     6             //获得配置文件的全路径  
     7             string strFileName = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;  
     8             // string  strFileName= AppDomain.CurrentDomain.BaseDirectory   "\exe.config";  
     9             doc.Load(strFileName);  
    10             //找出名称为“add”的所有元素  
    11             XmlNodeList nodes = doc.GetElementsByTagName("add");  
    12             for (int i = 0; i < nodes.Count; i  )  
    13             {  
    14                 //获得将当前元素的key属性  
    15                 XmlAttribute att = nodes[i].Attributes["key"];  
    16                 //根据元素的第一个属性来判断当前的元素是不是目标元素  
    17                 if (att.Value == strKey)  
    18                 {  
    19                     //对目标元素中的第二个属性赋值  
    20                     att = nodes[i].Attributes["value"];  
    21                     att.Value = ConnenctionString;  
    22                     break;  
    23                 }  
    24             }  
    25             //保存上面的修改  
    26             doc.Save(strFileName);  
    27             System.Configuration.ConfigurationManager.RefreshSection("appSettings");  
    28 }  
    

    当然这种方法肯定可以解决问题,有没有其他方法呢??

     

    现在回过头还是看上面的这个函数,看它的最后一行,它的作用是什么?

    在这里我要介绍一种比较简单的方法,可能已经有人知道了,那就是使用ConfigurationManager类

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

    查找msdn文档可以发现微软出于性能考虑,对配置文件App.config采用了缓存策略,因此,尽管上面的函数确实在磁盘文件中修改了节点的值,但是,当用前面的那个函数读取的时候,会依然得到原来的那个值,仿佛没有修改一样!所以,必须使用这么句话,进行一遍刷新,强制要求程序下一次读取的时候,从磁盘文件读取!

    ConfigurationManager 存在System.Configuration.dll 中。

    读:

    好了,现在使用Visual Studio写C#程序的童鞋应该都遇到了一个蛋疼的问题,就是在debug时,明明在程序中修改了配置文件,可是下次重新执行程序的时候,发现程序根本没有发生变化,打开与exe文件相对应的config文件查看,发现文件根本没有变化!!!!明明就是当作xml文件来操作的,怎么会这样?!

    代码如下:

    ConfigurationManager.ConnectionStrings["AccessDB"].ConnectionString;
    

    其实这就涉及VS的运行机制问题了,细心的童鞋会在exe文件的同目录下,发现有一个与之对应的vshost.exe,以及vshost.exe.config 文件,当打开这里的这个config文件后会发现,在这里面的xml文件的值发生了变化!对滴~VS无论在Debug还是Release下,运行的程序都是这个带有vshost的程序,修改的也是这个程序对应的config。但是,当程序刚刚启动的时候,却是读取的原来与exe文件对应的config文件,将这个config文件内容替换原来与vshost.exe对应的config里面内容,这也就是为什么每次重新开程序后恢复原状的原因。

    public static void Main()
    {
        Console.WriteLine(ConfigurationManager.AppSettings["name"]);
        ChangeConfiguration();
        Console.WriteLine(ConfigurationManager.AppSettings["name"]);
        Console.ReadLine();
    }
    
    private static void ChangeConfiguration()
    {
        //读取程序集的配置文件
        string assemblyConfigFile = Assembly.GetEntryAssembly().Location;
    
        Configuration config = ConfigurationManager.OpenExeConfiguration(assemblyConfigFile);
        //获取appSettings节点
        AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
    
    
        //删除name,然后添加新值
        appSettings.Settings.Remove("name");
        appSettings.Settings.Add("name", "new");
    
        //保存配置文件
        config.Save();
    }
    

    写:

    由于程序在VS里面调试的时候,运行的程序与直接去bin文件夹运行的程序不一样,所以,更推荐使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile来获取当前运行程序的配置文件。

    代码很简单:首先读取配置文件,接着获取appSettings节点,然后修改,接着保存。

    //设置连接字符串
    
    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:主要存储程序设置,以键值对的形式出现。

     

    新葡亰496net 1

    读:

    参考:C# winform把新值写入app.config文件 - CSDN博客  https://blog.csdn.net/xiangxianghehe/article/details/77825868

    可以看到输出的值是两个old.

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

       C#的配置文件App.config使用总结 - CSDN博客  https://blog.csdn.net/celte/article/details/9749389

    为什么??

    写:


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

    查找msdn文档可以发现微软出于性能考虑,对ConfigurationManager采用了缓存策略,所以如果要读取新的值,应该使用**ConfigurationManager的RefreshSection来进行刷新,**

     

    ConfigurationManager . RefreshSection:

    configSections:自定义配置节

    刷新命名节,这样在下次检索它时将从磁盘重新读取它。

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

    于是将Main方法修改为:

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

    Console.WriteLine(ConfigurationManager.AppSettings["name"]);

    System.Configuration.SingleTagSectionHandler

    ChangeConfiguration();

    System.Configuration.DictionarySectionHandler

    ConfigurationManager.RefreshSection("appSettings");

    System.Configuration.NameValueSectionHandler。

    Console.WriteLine(ConfigurationManager.AppSettings["name"]);

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

    重新清理解决方案,重新运行:

    三个不同的type操作:

    新葡亰496net 2

    <?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>
    

    可以看到,仍然是两个old。。。

     

    为什么??  

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

    难道值没有修改??,我们打开应用程序的配置文件,可以通过监视assemblyConfigFile获得路径

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

    上面是xxxbinDebugCAStudy.exe.,对应的配置文件就是CAStudy.exe.config

    //访问配置节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
    

    新葡亰496net 3

     

    文件的内容如下:

    配置节处理程序

    新葡亰496net 4

    返回类型

     

    SingleTagSectionHandler

    可以发现value 值已经更改,那么为什么输出还是old,old 呢??

    Systems.Collections.IDictionary

    为了验证不是VS2010的问题。

    DictionarySectionHandler

    首先手动将CAStudy.exe.config 文件中的value改为”old”,接着再次运行CAStudy.exe 结果如下:

    Systems.Collections.IDictionary

    新葡亰496net 5

    NameValueSectionHandler

     

    Systems.Collections.Specialized.NameValueCollection

    可以看到输出时old,和new。为什么会这样???

     

    难道调试时读取的不是修改的配置文件,或者修改的配置文件并不是调试的应用程序读取的文件??

    sectionGroup:自定义配置节组

    在assemblyConfigFile 中设置断点,可以发现assemblyConfigFile 读取的是CAStudy.exe.Config。但是vs调试的时候运行的是CAStudy.vshost.exe。也就是说我们使用ConfigurationManager.OpenExeConfiguration 打开的是CAStudy.exe.config文件,但是我们调试的应用程序CAStudy.vshost.exe使用的是CAStudy.vshost.exe.config文件。

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

    那么还有其他的方式可以准确的获取应用程序配置文件吗??

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

    有的,使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

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

    将ChangeConfiguration()方法修改如下:

    <?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>
    
    private static void ChangeConfiguration()
    {
    
        //读取程序集的配置文件
        string assemblyConfigFile = Assembly.GetEntryAssembly().Location;
        string appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
    
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    
    
         //获取appSettings节点
        AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
    
    
        //删除name,然后添加新值
        appSettings.Settings.Remove("name");
        appSettings.Settings.Add("name", "new");
    
        //保存配置文件
        config.Save();
    }
    

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

    清理,重新运行:

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

    使用默认的不传递字符串的版本就可以打开当前配置文件了。

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

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

     

    如果要查看当前配置文件的完整路径可以使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

    2.Settings.settings配置文件操作

     

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

    重新运行,结果如下:

     

    新葡亰496net 6

    二、用户自定义文件操作

     

    1.XML配置文件操作

    另外值得一提的是:ConfigurationManager.RefreshSection 不支持section Group.所以对于WCF的服务,你必须一个一个的RefreshSection:

    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);
             }

    ConfigurationManager.RefreshSection("system.serviceModel/behaviors");

     

    ConfigurationManager.RefreshSection("system.serviceModel/bindings");

    2.注册表配置操作

    ConfigurationManager.RefreshSection("system.serviceModel/client");

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

    ConfigurationManager.RefreshSection("system.serviceModel/services");

    操作实例:

    参考文章:How to Change .NET Configuration Files at Runtime (including for WCF)

          

             /// <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();
            }
    

     

    三、应用程序信息配置

    通过代码继承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;
                }
            }
        }
    

     

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net重在是应用程序的布置文件,操作方

    关键词:

上一篇:新葡亰496net第二次利用小记,轻易示例

下一篇:没有了