最近写一个打标的配置文件读取,让客户能够更改配置档的功能,我考虑用了INI档或修改App.config。
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文件的完整路径和名称。
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); } } }
<configuration> <configSections> //配置节声明区域,包含配置节和命名空间声明 <section> //配置节声明 <sectionGroup> //定义配置节组 <section> //配置节组中的配置节声明 </section> </sectionGroup> <appSettings> //预定义配置节 <Custom element for configuration section> //配置节设置区域 </appSettings> </configuration>
<?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>
配置文件的方法:
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,这需要根据需求和客户要求来决定,也不能确定哪一种方式为最好。