C#读写配置文件(.config)(二)

来源:互联网 发布:免费手机记账软件 编辑:程序博客网 时间:2024/05/29 17:33
终于下定决心使用webservice来做这个项目,但是发现winfrom程序在引用webservice使用手工写代码会让人累到吐血。无奈,使用程序自带的代码生成器。随即噩梦开始……
vs2005在书写*.exe.config文件与2003严重不同。这个心里早有预料,知道Properties.Settings.Default.Save()这个函数可以保存user范围的数据,就没看具体的保存方法。心血来潮的用这个见鬼的方法写了个错误的数据到配置文件测试测试,呵呵,保存成功,没有出现异常。
谁知再次打开程序,再初始化到webservice部分的时候提示“配置系统未能初始化”。。。我靠,傻眼。
开始尝试各种方法来恢复这个异常。检查文件,发现config文件压根就没变化,新建个同名的项目,一样的报错。
开始嘀咕不会是system.Configuration这个组件挂了吧。
装vs2005sp1,fw2.0sp1,不行。查google.com,发现都在问同样的问题,就是没有正解。
shit!!!老子还不信了。高尔基说:自己动手,丰衣足食。^_^!
开始分析,既然是调用了save方法,那么把这个方法改回去不就OK了。重新调用了save方法,问题依旧。
资料显示,save方法会将设置保存到C:/Documents and Settings/Administrator/Local Settings/Application Data,找了半天,没发现?!微软是在忽悠人吧!陷入绝望(已经准备好系统光盘,不行就重做系统)
再看看有什么方法。无意中,新建了个新的项目,直接引用webservice,调用正常。曙光……
估计是只有这个项目有问题,在翻看Properties.Settings.Default里面的方法时,发现rest()方法,救命稻草。
调用一下,搞定。恢复正常。
为了避免再出现这个问题,我把config文件中的字节范围定义为app型,并且重新写了3个方法用来存取。

        public static void WriteConfig(string KeyName, string Keyvalue)
        {
            // 以executable模式打开配置文件
            Configuration config = ConfigurationManager.OpenExeConfiguration
                       (ConfigurationUserLevel.None);

            // 先删除
            config.AppSettings.Settings.Remove(KeyName);

            // 再增加
            config.AppSettings.Settings.Add(KeyName,Keyvalue);

            // 保存
            config.Save(ConfigurationSaveMode.Full, true);
            // 刷新当前配置
            ConfigurationManager.RefreshSection("appSettings");
        }

        public static void WriteSetting(string sectionGroupName,string sectionName,string settingName,string newSettingValue)
        {
            
            // 以executable模式打开配置文件
            Configuration config = ConfigurationManager.OpenExeConfiguration
                       (ConfigurationUserLevel.None);
            //  获取sectionGroup   
            ConfigurationSectionGroup sectionGroup =
                config.GetSectionGroup(sectionGroupName);
            //  获取section   
            ClientSettingsSection section = 
                (ClientSettingsSection)sectionGroup.Sections.Get(sectionName);
            //  获取setting   
            SettingElement setting = section.Settings.Get(settingName);
            //  写新值  
            setting.Value.ValueXml.InnerText = newSettingValue;
            //  保存
            config.Save(ConfigurationSaveMode.Modified, true);
        }
        public static string ReadSetting(string sectionGroupName,string sectionName,string settingName)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration
           (ConfigurationUserLevel.None);
            //   获取sectionGroup   
            ConfigurationSectionGroup sectionGroup =
                config.GetSectionGroup(sectionGroupName);
            //   获取section   
            ClientSettingsSection section =
                (ClientSettingsSection)sectionGroup.Sections.Get(sectionName);
            //   获取setting   
            SettingElement setting = section.Settings.Get(settingName);
            //   读取setting   
            return setting.Value.ValueXml.InnerText;
        }   

注意,第一个方法是为了兼容以前vs2003的config文件格式做的一个方法,主要处理<appsetting><appsetting>
而后面两个方法是vs2005下存取配置文件的。不过,第二个方法有点小问题没有找到好的办法来解决。至于是什么问题,你用上一次以后就知道了。hoho~~~~,看看保存完的配置文件跟以前有什么不同。。 
0 0
原创粉丝点击