zoukankan      html  css  js  c++  java
  • 小菜的系统框架界面设计-应用程序中使用配置档

    使用背景

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

    概述

    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文件的完整路径和名称。

    代码实例(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")+"
    ");
                richTextBox1.AppendText("UserId:"+IniReadValue("ServerConfig", "UserId")+"
    ");
                richTextBox1.AppendText("Password:"+IniReadValue("ServerConfig", "Password")+"
    ");
            }
    
            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,这需要根据需求和客户要求来决定,也不能确定哪一种方式为最好。

  • 相关阅读:
    ubuntu14.04恢复系统默认中文字体
    Mcafee两个Mac版本之间的区别
    关于Windows系统防火墙
    诺顿序列号获取方法
    如何将软件限制策略发挥大作用
    BootCamp支持软件4/5
    Android系统分区理解及分区目录细解
    给Adobe Reader添加书签功能
    PHP面向对象之旅:static变量与方法
    INSERT IGNORE 与 INSERT INTO的区别
  • 原文地址:https://www.cnblogs.com/aganqin/p/3392166.html
Copyright © 2011-2022 走看看