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,这需要根据需求和客户要求来决定,也不能确定哪一种方式为最好。

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/aganqin/p/3392166.html
Copyright © 2011-2022 走看看