先Show示例:
private void TestINI_Load(object sender, System.EventArgs e)
{
//创建一个INIFile对象,参数为文件路径,如果不存在它会自动创建的
INIFile inf=new INIFile(@"D:\工作目录\VSPP\VSPPServer\bin\Debug\COMPILED.INI");
//显示INI配置的结构
foreach(string k in inf.Segments.Keys)
{
TreeNode o=new TreeNode(k);
INISegment s=inf.Segments[k]; //取出当前配置节
foreach(string k1 in s.Items.Keys)
{
TreeNode o1=new TreeNode(k1+" = "+s.Items[k1].Value); //访问配置节中每个配置项
o.Nodes.Add(o1);
}
treeView1.Nodes.Add(o);
}
//添加一个配置
inf.Segments.Add("Test"); //添加Test节
inf.Segments["Test"].Items.Add("IP","192.168.0.1"); //添加一个配置项
//快速添加一个配置项
inf.Segments["测试"].Items["Host"].Value="localhost"; // :)和上面两行一样的效果
//读取也是同样的方便
MessageBox.Show(inf.Segments["测试"].Items["Host"].Value);
//如果不存在这样的配置项,将返回空字符串并创建这个项
MessageBox.Show(inf.Segments["测试"].Items["Server"].Value);
//清除一个配置节下面的所有配置项
//inf.Segments["Action"].Clear();
}
再Show代码:
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
namespace eGlic
{
#region INI文件操作类
///
1<summary>
2/// 配置节
3/// </summary>
public class INISegment
{
private string __Name;
private INISegments __Owner;
///
1<summary>
2/// 所有配置项集合
3/// </summary>
public INIItems Items;
///
1<summary>
2/// 构造函数
3/// </summary>
///
1<param name="o"/>
Owner
///
1<param name="vName"/>
配置节名称
public INISegment(INISegments o,string vName)
{
__Owner=o;
__Name=vName;
Items=new INIItems(this);
o.Owner.GetSegment(this);
}
///
1<summary>
2/// 获取配置节的名称
3/// </summary>
public string Name
{
get {return __Name;}
}
///
1<summary>
2/// 获取Segment的Owner:INISegments集合
3/// </summary>
public INISegments Owner
{
get {return __Owner;}
}
///
1<summary>
2/// 清除所有设置项
3/// </summary>
public void Clear()
{
__Owner.Owner.WriteSegment(__Name,"\0\0");
}
}
///
1<summary>
2/// 配置节集合
3/// </summary>
public class INISegments : DictionaryBase
{
private INIFile __Owner;
///
1<summary>
2/// 构造函数
3/// </summary>
///
1<param name="o"/>
Owner
public INISegments(INIFile o)
{
__Owner=o;
}
///
1<summary>
2/// 获取此对象的Owner:INIFile类
3/// </summary>
public INIFile Owner
{
get {return __Owner;}
}
///
1<summary>
2/// 添加一个已经存在的配置节
3/// </summary>
///
1<param name="o"/>
配置节对象
public void Add(INISegment o)
{
if(!Dictionary.Contains(o.Name))
Dictionary.Add(o.Name,o);
}
///
1<summary>
2/// 添加一个可能不存在的配置节(创建一个配置节)
3/// </summary>
///
1<param name="vName"/>
配置节名称
///
1<returns>添加的配置节</returns>
public INISegment Add(string vName)
{
if(Dictionary.Contains(vName))
return (INISegment)Dictionary[vName];
INISegment o=new INISegment(this,vName);
Dictionary.Add(vName,o);
return o;
}
///
1<summary>
2/// 获取索引集合
3/// </summary>
public ICollection Keys
{
get {return Dictionary.Keys;}
}
///
1<summary>
2/// 获取值集合
3/// </summary>
public ICollection Values
{
get {return Dictionary.Values;}
}
///
1<summary>
2/// 获取配置节
3/// </summary>
public INISegment this [string vName]
{
get{
if(!Dictionary.Contains(vName))
return this.Add(vName);
else
return (INISegment)Dictionary[vName];
}
}
///
1<summary>
2/// 获取是否包含某配置节
3/// </summary>
///
1<param name="vName"/>
配置节名称
///
1<returns>是否</returns>
public bool Contains(string vName)
{
return Dictionary.Contains(vName);
}
}
///
1<summary>
2/// 配置项
3/// </summary>
public class INIItem
{
private string __Name;
private string __Value;
private INIItems __Owner;
///
1<summary>
2/// 构造函数
3/// </summary>
///
1<param name="o"/>
Owner
///
1<param name="vName"/>
名称
///
1<param name="vValue"/>
值
public INIItem(INIItems o,string vName,string vValue)
{
__Owner=o;
__Name=vName;
__Value=vValue;
if(!o.Contains(vName))
o.Owner.Owner.Owner.SetString(o.Owner.Name,vName,vValue);
}
///
1<summary>
2/// 获取名称
3/// </summary>
public string Name
{
get {return __Name;}
}
///
1<summary>
2/// 获取设置值
3/// </summary>
public string Value
{
get {return __Value;}
set {
__Value=value;
__Owner.Owner.Owner.Owner.SetString(__Owner.Owner.Name,__Name,value);
}
}
///
1<summary>
2/// 获取Owner
3/// </summary>
public INIItems Owner
{
get {return __Owner;}
}
}
///
1<summary>
2/// 配置项集合
3/// </summary>
public class INIItems : DictionaryBase
{
private INISegment __Owner;
///
1<summary>
2/// 构造函数
3/// </summary>
///
1<param name="o"/>
Owner
public INIItems(INISegment o)
{
__Owner=o;
}
///
1<summary>
2/// 获取Owner
3/// </summary>
public INISegment Owner
{
get {return __Owner;}
}
///
1<summary>
2/// 添加一个已经存在的配置项
3/// </summary>
///
1<param name="o"/>
配置项
public void Add(INIItem o)
{
if(!Dictionary.Contains(o.Name))
Dictionary.Add(o.Name,o);
}
///
1<summary>
2/// 获取是否包含指定名称的配置项
3/// </summary>
///
1<param name="vName"/>
配置项名称
///
1<returns>是否</returns>
public bool Contains(string vName)
{
return Dictionary.Contains(vName);
}
///
1<summary>
2/// 获取所有的索引集合
3/// </summary>
public ICollection Keys
{
get {return Dictionary.Keys;}
}
///
1<summary>
2/// 获取所有的值集合
3/// </summary>
public ICollection Values
{
get {return Dictionary.Values;}
}
///
1<summary>
2/// 添加一个可能不存在的配置项(创建一个配置项)
3/// </summary>
///
1<param name="vName"/>
配置项名
///
1<param name="vValue"/>
配置项值
///
1<returns>创建的配置项INIItem对象</returns>
public INIItem Add(string vName,string vValue)
{
if(Dictionary.Contains(vName))
return (INIItem)Dictionary[vName];
else
{
INIItem o=new INIItem(this,vName,vValue);
this.Add(o);
return o;
}
}
///
1<summary>
2/// 获取指定索引的配置项
3/// </summary>
public INIItem this[string vName]
{
get {
if(Dictionary.Contains(vName))
return (INIItem)Dictionary[vName];
else
return this.Add(vName,"");
}
}
}
///
1<summary>
2/// INI文件操作类
3/// </summary>
public class INIFile
{
#region 导入DLL函数
[DllImport("kernel32.dll")] public extern static int GetPrivateProfileIntA(string segName,string keyName,int iDefault,string fileName);
[DllImport("kernel32.dll")] public extern static int GetPrivateProfileStringA(string segName,string keyName,string sDefault,StringBuilder retValue,int nSize,string fileName);
[DllImport("kernel32.dll")] public extern static int GetPrivateProfileSectionA(string segName,byte [] sData,int nSize,string fileName);
[DllImport("kernel32.dll")] public extern static int WritePrivateProfileSectionA(string segName,byte [] sData,string fileName);
[DllImport("kernel32.dll")] public extern static int WritePrivateProfileStringA(string segName,string keyName,string sValue,string fileName);
[DllImport("kernel32.dll")] public extern static int GetPrivateProfileSectionNamesA(byte [] vData,int iLen,string fileName);
#endregion
private string __Path;
///
1<summary>
2/// 所有的配置节
3/// </summary>
public INISegments Segments;
///
1<summary>
2/// 构造函数
3/// </summary>
///
1<param name="vPath"/>
INI文件路径
public INIFile(string vPath)
{
__Path=vPath;
Segments=new INISegments(this);
byte [] bufsegs=new byte [32767];
int rel=GetPrivateProfileSectionNamesA(bufsegs,32767,__Path);
int iCnt,iPos;
string tmp;
if(rel>0)
{
iCnt=0;iPos=0;
for(iCnt=0;iCnt
1<rel;icnt++) )="" <summary="" if(bufsegs[icnt]="0x00)" if(tmp!="" ipos="iCnt+1;" segments.add(tmp);="" tmp="System.Text.ASCIIEncoding.Default.GetString(bufsegs,iPos,iCnt).Trim();" {="" }="">
2/// 获取INI文件路径
3///
4public string Path
5{
6get {return __Path;}
7}
8/// <summary>
9/// 读取一个整数型的配置值
10/// </summary>
11/// <param name="segName"/>配置节名
12/// <param name="keyName"/>配置项名
13/// <param name="iDefault"/>默认值
14/// <returns>配置值</returns>
15public int GetInt(string segName,string keyName,int iDefault)
16{
17return GetPrivateProfileIntA(segName,keyName,iDefault,__Path);
18}
19
20/// <summary>
21/// 读取一个字符串型配置值
22/// </summary>
23/// <param name="segName"/>配置节名
24/// <param name="keyName"/>配置项名
25/// <param name="sDefault"/>默认值
26/// <returns>配置值</returns>
27public string GetString(string segName,string keyName,string sDefault)
28{
29StringBuilder red=new StringBuilder(1024);
30GetPrivateProfileStringA(segName,keyName,"",red,1024,__Path);
31return red.ToString();
32}
33
34/// <summary>
35/// 写入配置项
36/// </summary>
37/// <param name="segName"/>配置节名
38/// <param name="keyName"/>配置项名
39/// <param name="vValue"/>配置值
40public void SetString(string segName,string keyName,string vValue)
41{
42WritePrivateProfileStringA(segName,keyName,vValue,__Path);
43}
44/// <summary>
45/// 写入一个配置节
46/// </summary>
47/// <param name="segName"/>配置节名
48/// <param name="vData"/>数据
49/// <remarks>
50/// 数据为多个配置项组成的字符串,每个配置项之间用 "\0" 分割
51/// 字符串最后用 "\0\0" 结束
52/// </remarks>
53/// <example>
54/// WriteSegment(segName,"\0\0"); 可以用于清除一个配置节下的所有配置项
55/// </example>
56public void WriteSegment(string segName,string vData)
57{
58WritePrivateProfileSectionA(segName,System.Text.ASCIIEncoding.Default.GetBytes(vData),__Path);
59}
60/// <summary>
61/// 读取一个配置节下面的所有配置项
62/// </summary>
63/// <param name="o"/>要读取的配置节
64public void GetSegment(INISegment o)
65{
66byte [] vData=new byte [32767];
67int rLen=GetPrivateProfileSectionA(o.Name,vData,32767,__Path);
68o.Items.Clear();
69if(rLen<1) return;
70string tmp="";
71int iPos,iCnt;
72iPos=0;
73for(iCnt=0;iCnt<rLen;iCnt++)
74{
75if(vData[iCnt]==0x00)
76{
77tmp=System.Text.ASCIIEncoding.Default.GetString(vData,iPos,iCnt-iPos).Trim();
78if(tmp!="")
79{
80string [] t=tmp.Split('=');
81if(t.Length<=1)
82o.Items.Add(t[0],"");
83else
84o.Items.Add(t[0],t[1]);
85}
86iPos=iCnt+1;
87}
88}
89}
90}
91#endregion
92}</rel;icnt++)>