C# 操作INI文件类 (eGlic原创)

先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&lt;1) return;   
70string tmp="";   
71int iPos,iCnt;   
72iPos=0;   
73for(iCnt=0;iCnt&lt;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&lt;=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++)>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus