小菜的系统框架界面设计-应用程序中使用配置档

使用背景

最近写一个打标的配置文件读取,让客户可以更改配置档的功能,我考虑用了INI档或修改App.config。node

概述

INI档

INI就是扩展名为"INI"的文件,其实他自己是个文本文件,能够用记事本打工,主要存放的是用户所作的选择或系统的各类参数.
INI文件其实并非普通的文本文件.它有本身的结构.由若干段落(SECTION)组成,在每一个带括号的标题下面,是若干个以单个单词开头的关键字(KEYWORD)和一个等号,等号右边就是关键字的值(VALUE).例如:
[Section1]
    KeyWord1 = Value1
    KeyWord2 = Value2
    ...
[Section2]
    KeyWord3 = Value3
    KeyWord4 = Value4架构

C#命名空间中没有直接读写INI的类,固然若是你把INT当成文本文件用System.IO类来读写算我没说.
我如今介绍的是系统处理INI的方法.
虽然C#中没有,可是在"kernel32.dll"这个文件中有Win32的API函数--WritePrivateProfileString()和GetPrivateProfileString()
C#声明INI文件的写操做函数WritePrivateProfileString():
[DllImport( "kernel32" )]
  private static extern long WritePrivateProfileString ( string section ,string key , string val
, string filePath ) ;
参数说明:section:INI文件中的段落;key:INI文件中的关键字;val:INI文件中关键字的数值;filePath:INI文件的完整的路径和名称。
C#申明INI文件的读操做函数GetPrivateProfileString(): [DllImport("kernel32")]
private static extern int GetPrivateProfileString ( string section ,
  string key , string def , StringBuilder retVal ,
  int size , string filePath ) ;参数说明:section:INI文件中的段落名称;key:INI文件中的关键字;def:没法读取时候时候的缺省数值;retVal:读取数值;size:数值的大小;filePath:INI文件的完整路径和名称。 app

代码实例(INI)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace IniConfigDemo
{
    public partial class Form1 : Form
    {
        public string FilePath;
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            FilePath = Application.StartupPath + "/FTPServer.ini";
            txtFilePath.Text = FilePath;

            richTextBox1.AppendText("Server:"+IniReadValue("ServerConfig","IP")+"\n");
            richTextBox1.AppendText("UserId:"+IniReadValue("ServerConfig", "UserId")+"\n");
            richTextBox1.AppendText("Password:"+IniReadValue("ServerConfig", "Password")+"\n");
        }

        private void btnCreateIni_Click(object sender, EventArgs e)
        {
            if (ExistIniFile())
            {
                if (MessageBox.Show(@"已存在一外同名文件,是否要覆盖此文件?", @"警告", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    CreateIniFile();
                }
            }
            else
            {
                CreateIniFile();
            }
         
        }
        void CreateIniFile()
        {
            IniWriteValue("ServerConfig", "IP", "192.168.0.152");
            IniWriteValue("ServerConfig", "UserId", "aganqin");
            IniWriteValue("ServerConfig", "Password", "12345");
        }

        /// <summary>
        /// 写入INI文件
        /// </summary>
        /// <param name="section">项目名称(如 [TypeName] )</param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void IniWriteValue(string section, string key, string value)
        {
            WritePrivateProfileString(section, key, value, this.FilePath);
        }


        /// <summary>
        /// 读出INI文件
        /// </summary>
        /// <param name="section">项目名称(如 [TypeName] )</param>
        /// <param name="key"></param>
        public string IniReadValue(string section, string key)
        {
            StringBuilder temp = new StringBuilder(500);
            int i = GetPrivateProfileString(section, key, "", temp, 500, this.FilePath);
            return temp.ToString();
        }

        /// <summary>
        /// 验证文件是否存在
        /// </summary>
        /// <returns>布尔值</returns>
        public bool ExistIniFile()
        {
            return File.Exists(FilePath);
        }
    }
}

App.config档

  • 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是能够按须要更改的,开发人员可使用配置文件来更改设置,而没必要重编译应用程序。配置文件的根节点是configuration。咱们常常访问的是appSettings,它是由.Net预约义配置节。咱们常常使用的配置文件的架构是象下面的形式。先大概有个印象,经过后面的实例会有一个比较清楚的认识。下面的“配置节”能够理解为进行配置一个XML的节点。

    常见配置文件模式:
 
 
 
 
 
<configuration>
 <configSections> //配置节声明区域,包含配置节和命名空间声明 <section> //配置节声明   <sectionGroup> //定义配置节组   
 <section> //配置节组中的配置节声明 
 </section>
</sectionGroup> 
<appSettings> //预约义配置节
 <Custom element for configuration section> //配置节设置区域 
</appSettings> 
</configuration>

  • 只有appSettings节的配置文件及访问方法
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<appSettings> 
<add key="connectionstring" value="User ID=sa;Data Source=.;Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" /> 
<add key="TemplatePATH" value="Template" /> 
</appSettings> 
</configuration>

代码实例(App.config)

配置文件的方法:
string _connectionString=ConfigurationSettings.AppSettings["connectionstring"];
使用ConfigurationSettings类的静态属性AppSettings就能够直接方法配置文件中的配置信息。这个属性的类型是NameValueCollection。 
更改配置档的方法:
 
public static void UpdateConfig(string appKey, string Xvalue)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(AppConfig());
            XmlNode node = doc.SelectSingleNode(@"//appSettings");
            XmlElement ele = (XmlElement)node.SelectSingleNode("//add[@key='" + appKey + "']");
            ele.SetAttribute("value", Xvalue);
            doc.Save(AppConfig());
        }

总结

由于应用程序有不少配置,参数都须要用到的这些配置知识,有的须要用App.config,有的要用Ini,这须要根据需求和客户要求来决定,也不能肯定哪种方式为最好。ide