C#配置文件管理

摘要:
在c#wpf项目中,通常有两种类型的配置文件。一个是系统中的新配置文件,即应用程序配置文件,通常命名为App-config另一个是自定义配置文件。这类配置文件的命名和定义相对自由,内部节点的设置相对随意。最重要的是满足需求。

  最近在做项目的过程中用到配置文件,本文简要说明本人在项目过程中是如何使用配置文件的,目的是加深自己对配置文件管理的理解,以便在下次使用时能做到轻松自如。

  配置文件,顾名思义,是用户在使用系统或者软件时需要根据不同的状况手动配置的文件。在c#wpf项目中,配置文件一般有两种,一种是在系统中新建的配置文件即应用程序配置文件,命名一般习惯为App.config;另外一种则是根据需要自定义的配置文件,这类配置文件命名定义比较自由,同时内部的节点的设置等都比较随便,最主要的是满足需求。下面首先描述应用程序配置文件App.config。

1、应用程序配置文件

新建应用程序配置文件:

  选中工程名称,右键添加现有项选择应用程序配置文件,此次一般命名为App.config。

  在configuration中添加如下内容,此次是添加了两个字段。

<appSettings>
      <add key="id" value ="13"/>
    <add key ="user" value ="24"/>
    </appSettings>

读取配置文件内容:

  

  首先添加引用:system.configuration,并在代码添加using System.Configuration;

  读取字段值:string str1 = System.Configuration.ConfigurationManager.AppSettings["id"];

应用程序配置文件的使用相对简单稳定,适合于一般的配置文件值的设置。但是如果需要经常的更改或者增加配置文件字段值,应用程序配置文件则显得较为繁琐。

2、自定义配置文件

使用场景:

  由于此类文件具有:1、可以手动更改配置文件中字段的值;2、能够保存最近输入字段的值。所以比较适合于在系统应用过程中需要经常变动的值,而且它的第二种功能因为能记住最近一次输入的值而显的尤为重要。

新建自定义配置文件:

  选中工程名称右键添加新建项,选择文本文件并更改名称,此次暂定义为system.cfg。打开文件显示一个空的文件,此次添加如下:<configurationN  ServerAddress="192.273"  />。注:由于xml文件易于保存添加和更改,此处添加的xml文件格式。

在代码中对配置文件进行更改和添加:

  在代码中加入一个字段:

C#配置文件管理第1张C#配置文件管理第2张
private string _ServerAddress;
        public string ServerAddress
        {
            get { return _ServerAddress; }
            set 
            {
                this._ServerAddress = value;
                NotifyPropertyChanged("ServerAddress");
            }
        }

public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
View Code

  代码中定义xml的字段:

    public const string managerName = "configurationN";
        public const string configuration_ServerAdderss = "ServerAddress";

  初始化配置文件:

C#配置文件管理第3张C#配置文件管理第4张
public bool Load(string path)
        {
            bool ret = true;
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(path);
                foreach (XmlNode node in doc.ChildNodes)
                {
                    switch (node.Name)
                    {
                        case managerName:
                            this.LoadXMLNode(node);
                            break;
                    }
                }
            }
            catch
            {
                ret = false;
            }
            return ret;
        }

        public bool LoadXMLNode(XmlNode node)
        {
            bool ret = true;
            try
            {
                Utils.ReadXMLAttribute(this, node.Attributes, configuration_ServerAdderss);
            }
            catch (Exception ex)
            {
                ret = false;
            }
            return ret;
        }
View Code

  保存配置文件:

C#配置文件管理第5张C#配置文件管理第6张
public bool Save(string path)
        {
            bool ret = true;
            try
            {
                XmlDocument doc = new XmlDocument();
                XmlNode node = doc.CreateNode(XmlNodeType.Element, managerName, null);
                this.SaveXMLNode(doc, node);
                doc.AppendChild(node);
                doc.Save(path);
            }
            catch
            {
                ret = false;
            }
            return ret;
        }

        public bool SaveXMLNode(XmlDocument xmlDoc, XmlNode node)
        {
            bool ret = true;
            try
            {
                Utils.AppendXMLAttribute(node, xmlDoc, configuration_ServerAdderss, this.ServerAddress);
            }
            catch (Exception ex)
            {
                ret = false;
            }
            return ret;
        }
View Code

  上述过程中用到的读取和增加xml节点的方法:

C#配置文件管理第7张C#配置文件管理第8张
public static bool ReadXMLAttribute(object obj, XmlAttributeCollection attrs, string attributeName)
        {
            PropertyInfo tmp = null;
            try
            {
                object[] args = new object[1];
                Type ot = obj.GetType();
                PropertyInfo pi = ot.GetProperty(attributeName);
                tmp = pi;
                if (pi.PropertyType.FullName == "System.String")
                {
                    args[0] = attrs[attributeName].Value.ToString();
                    ot.InvokeMember(attributeName, System.Reflection.BindingFlags.SetProperty, null, obj, args);
                }
                else if (pi.PropertyType.BaseType.FullName == "System.Enum")
                {
                    args[0] = Enum.Parse(pi.PropertyType, attrs[attributeName].Value);
                    ot.InvokeMember(attributeName, System.Reflection.BindingFlags.SetProperty, null, obj, args);
                }
                else if (pi.PropertyType.FullName == "System.Int32")
                {
                    args[0] = Convert.ToInt32(attrs[attributeName].Value);
                    ot.InvokeMember(attributeName, System.Reflection.BindingFlags.SetProperty, null, obj, args);
                }

            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }

        public static bool AppendXMLAttribute(XmlNode node, XmlDocument xmlDoc, string attributeName, object value)
        {
            try
            {

                XmlAttribute attr = xmlDoc.CreateAttribute(attributeName);
                if (value == null)
                {
                    attr.Value = "";
                }
                else
                {
                    attr.Value = value.ToString();
                }
                node.Attributes.Append(attr);
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }
View Code

调用部分(wpf窗体):

C#配置文件管理第9张C#配置文件管理第10张
public MainWindow()
        {
            InitializeComponent();
            Start();
            this.tb1.Text = ConfigurationManager.Instance.ServerAddress.ToString();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            ConfigurationManager.Instance.ServerAddress = tb1.Text;
            ConfigurationManager.Instance.Save(ConstDefs.FileNames.SystemConfig);
        }

        private void Start()
        {
            ConfigurationManager.Instance.Load(ConstDefs.FileNames.SystemConfig);
        }
View Code

  总结:自定义配置文件的格式一般为xml格式,在操作文件过程中,首先需要将配置文件的属性的复制到输出目录设置为如果较新则复制,然后初始化xml文件并读取节点值,在操作调用完毕后保存xml配置文件,则将保存最近输入的字段值,从而满足新建自定义配置文件的目的。

 3、

最近看到一个写的非常好的配置项目,记录下来:

int interval;
var sInterval = ConfigurationManager.AppSettings["SInterval"];
Interval = int.TryParse(sInterval, out interval) ? interval : 3000; //default 3000

  

  

免责声明:文章转载自《C#配置文件管理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webp图片实践之路水果机的几率设计下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

阿里云OSS存储

1.accessKeyId与accessKeySecret是由系统分配给用户的,称为ID对,用于标识用户,为访问OSS做签名验证。 2.Bucket是OSS上的命名空间,相当于数据的容器,可以存储若干数据实体(Object) 你可以按照下面的代码新建一个Bucket: /// <summary> /// 新建...

Java导出成可运行Jar包 dll或者so加载失败的解决方案

正常情况下, xxx.class.getResourceAsStream(lib) 这样就可以获取到了。但是我的是在JFrame的初始化中的, 所以需要Thread.currentThread().getContextClassLoader().getResourceAsStream(lib); 这样来获取。   这个坑  找了蛮久才找到解决方案记录下。...

音频拼接的简单实现方法(python一种,java两种)

音频拼接,就是5s+5s=10s的这种拼接。 需要修改的地方都是有三处,在代码里标注好了。 一、Python实现: Python3 #!/usr/bin/env python # -*- coding:utf-8 -*- # ok,音频拼接 from pydub import AudioSegment # 先导入这个模块 # 加载需要合并的两个mp3音...

spring mvc 的jpa JpaRepository数据层 访问方式汇总

本文转载:http://perfy315.iteye.com/blog/1460226和http://jishiweili.iteye.com/blog/2088265 AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案,下面就对Spring Data相关知识作一个较为详细的描述。1.Spring Data所解决的...

Java 反射原理

一、Java 反射的定义 反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法或者属性; 二、反射提供的功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成...

Golang的高级数据类型-切片(slice)实战篇

          Golang的高级数据类型-切片(slice)实战篇                              作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。        切片(slice)是Go中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合,切片是围绕动态数组的概念构建的,可以按需自动增长。   ...