刚写完读XML配置的类,突发奇想,想写一个不调用API来读INI文件的类,经过一点点努力,终于实现了,现将代码帖出。
http://xingfustar.cnblogs.com
/*
----------------------------------------------------------------
* 版权: http://XingFuStar.cnblogs.com
*
* 文件名: IniConfig
* 文件功能描述: 不调用API读写INI文件类
*
* 作者:XingFuStar
* 日期:2007年9月13日
*
* 当前版本:V1.0.0
*
* 修改日期:
* 修改内容:
*--------------------------------------------------------------- */
/* ----------------------------------------------------------------
*
* 为保证代码的正确性,对INI文件做如下要求:
* 1、以";"开头代表注释,注释要另起一行,不要使用非";"开头的注释
* 2、如果使用了非";"开头的注释,该行中不要包括“=”
* 3、如果使用了非";"开头的注释,对INI进行设置生,该行会被删除
*
*--------------------------------------------------------------- */
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
namespace XingFuStudio.Config
{
class IniConfig
{
private string iniPath = "" ;
private bool isConfig;
private ArrayList propertyList;
/// <summary>
/// 构造函数:装载配置文件
/// </summary>
/// <param name="iniPath"> 配置文件的路径 </param>
public IniConfig( string iniPath)
{
// 请不要删除以下信息
// 版权: http://XingFuStar.cnblogs.com
this .IniPath = iniPath;
}
public string IniPath
{
set
{
iniPath = value;
isConfig = OnIniPataChanged();
}
}
/// <summary>
/// 读取Ini中的配置
/// </summary>
/// <param name="section"> 节点 </param>
/// <param name="key"> 键 </param>
/// <param name="value"> 返回的键值 </param>
/// <returns> 读取是否成功 </returns>
public bool ReadConfig( string section, string key, ref string value)
{
bool isRead = false ;
try
{
if (isConfig)
{
for ( int i = 0 ; i < propertyList.Count; i ++ )
{
Property p = (Property)propertyList[i];
if (p.Section == section && p.Key == key)
{
value = p.Value;
isRead = true ;
break ;
}
}
}
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isRead;
}
/// <summary>
/// 向INI中写入配置
/// </summary>
/// <param name="section"> 节点 </param>
/// <param name="key"> 键 </param>
/// <param name="value"> 要写入的新键值 </param>
/// <returns> 写入是否成功 </returns>
public bool WriteConfig( string section, string key, string value)
{
bool isWrite = false ;
try
{
if (isConfig)
{
for ( int i = 0 ; i < propertyList.Count; i ++ )
{
Property p = (Property)propertyList[i];
if (p.Section == section && p.Key == key)
{
p.Value = value;
isWrite = SaveIni();
break ;
}
}
}
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isWrite;
}
#region 私有方法
private bool OnIniPataChanged()
{
bool isLoad = false ;
try
{
if (File.Exists(iniPath))
{
isLoad = LoadIni();
}
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isLoad;
}
/// <summary>
/// 从文件中加载INI配置信息到列表
/// </summary>
/// <returns> 加载是否成功 </returns>
private bool LoadIni()
{
bool isLoad = false ;
try
{
propertyList = new ArrayList();
StreamReader stream = new StreamReader(iniPath, System.Text.Encoding.Default);
string section = "" ;
while (stream.Peek() != - 1 )
{
string str = stream.ReadLine().Trim();
// 判断该行是否有数据
if (str.Length > 0 )
{
// 以“;”开头的行为注释行(硬性规定)
if (str.Substring( 0 , 1 ) != " ; " )
{
// 以“[“开头的行为Section行(硬性规定)
if (str.Substring( 0 , 1 ) == " [ " )
{
// 记录当前Section
section = str.Substring( 1 , str.IndexOf( " ] " ) - 1 );
}
// 有“=”的为数据行(硬性规定)
if (str.IndexOf( " = " ) > 0 )
{
string [] temp = str.Split( ' = ' );
// 将该数据行的属性添加到列表
propertyList.Add( new Property(section, temp[ 0 ].Trim(), temp[ 1 ].Trim(), "" ));
}
}
else
{
// 将注释行的属性添加到列表
propertyList.Add( new Property(section, "" , "" , str));
}
}
else
{
// 为保证格式与加载前相同,因些将空行也加入了列表
propertyList.Add( new Property( "" , "" , "" , "" ));
}
}
stream.Close();
isLoad = true ;
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isLoad;
}
/// <summary>
/// 将列表中的配置信息保存到INI文件
/// </summary>
/// <returns> 保存是否成功 </returns>
private bool SaveIni()
{
bool isSave = false ;
try
{
StreamWriter stream = new StreamWriter(iniPath, false , System.Text.Encoding.Default);
string section = "" ;
for ( int i = 0 ; i < propertyList.Count; i ++ )
{
Property p = (Property)propertyList[i];
// 写入Section
if (p.Section != "" && p.Section != section)
{
section = p.Section;
stream.WriteLine( " [ " + section + " ] " );
}
// 写入注释
if (p.Description != "" )
{
stream.WriteLine(p.Description);
}
// 写入键和键值
if (p.Key != "" )
{
stream.WriteLine(p.Key + " = " + p.Value);
}
// 写入空行
if (p.Section == "" && p.Description == "" )
{
stream.WriteLine( "" );
}
}
stream.Close();
isSave = true ;
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isSave;
}
/// <summary>
/// 内部类:Ini属性
/// </summary>
private class Property
{
string section = "" ;
/// <summary>
/// 节点
/// </summary>
public string Section
{
get { return section; }
set { section = value; }
}
string key = "" ;
/// <summary>
/// 键
/// </summary>
public string Key
{
get { return key; }
set { key = value; }
}
string value = "" ;
/// <summary>
/// 键值
/// </summary>
public string Value
{
get { return this .value; }
set { this .value = value; }
}
string description = "" ;
/// <summary>
/// 注释
/// </summary>
public string Description
{
get { return description; }
set { description = value; }
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="description"></param>
public Property( string section, string key, string value, string description)
{
this .Section = section;
this .Key = key;
this .Value = value;
this .Description = description;
}
}
#endregion
}
}
* 版权: http://XingFuStar.cnblogs.com
*
* 文件名: IniConfig
* 文件功能描述: 不调用API读写INI文件类
*
* 作者:XingFuStar
* 日期:2007年9月13日
*
* 当前版本:V1.0.0
*
* 修改日期:
* 修改内容:
*--------------------------------------------------------------- */
/* ----------------------------------------------------------------
*
* 为保证代码的正确性,对INI文件做如下要求:
* 1、以";"开头代表注释,注释要另起一行,不要使用非";"开头的注释
* 2、如果使用了非";"开头的注释,该行中不要包括“=”
* 3、如果使用了非";"开头的注释,对INI进行设置生,该行会被删除
*
*--------------------------------------------------------------- */
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
namespace XingFuStudio.Config
{
class IniConfig
{
private string iniPath = "" ;
private bool isConfig;
private ArrayList propertyList;
/// <summary>
/// 构造函数:装载配置文件
/// </summary>
/// <param name="iniPath"> 配置文件的路径 </param>
public IniConfig( string iniPath)
{
// 请不要删除以下信息
// 版权: http://XingFuStar.cnblogs.com
this .IniPath = iniPath;
}
public string IniPath
{
set
{
iniPath = value;
isConfig = OnIniPataChanged();
}
}
/// <summary>
/// 读取Ini中的配置
/// </summary>
/// <param name="section"> 节点 </param>
/// <param name="key"> 键 </param>
/// <param name="value"> 返回的键值 </param>
/// <returns> 读取是否成功 </returns>
public bool ReadConfig( string section, string key, ref string value)
{
bool isRead = false ;
try
{
if (isConfig)
{
for ( int i = 0 ; i < propertyList.Count; i ++ )
{
Property p = (Property)propertyList[i];
if (p.Section == section && p.Key == key)
{
value = p.Value;
isRead = true ;
break ;
}
}
}
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isRead;
}
/// <summary>
/// 向INI中写入配置
/// </summary>
/// <param name="section"> 节点 </param>
/// <param name="key"> 键 </param>
/// <param name="value"> 要写入的新键值 </param>
/// <returns> 写入是否成功 </returns>
public bool WriteConfig( string section, string key, string value)
{
bool isWrite = false ;
try
{
if (isConfig)
{
for ( int i = 0 ; i < propertyList.Count; i ++ )
{
Property p = (Property)propertyList[i];
if (p.Section == section && p.Key == key)
{
p.Value = value;
isWrite = SaveIni();
break ;
}
}
}
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isWrite;
}
#region 私有方法
private bool OnIniPataChanged()
{
bool isLoad = false ;
try
{
if (File.Exists(iniPath))
{
isLoad = LoadIni();
}
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isLoad;
}
/// <summary>
/// 从文件中加载INI配置信息到列表
/// </summary>
/// <returns> 加载是否成功 </returns>
private bool LoadIni()
{
bool isLoad = false ;
try
{
propertyList = new ArrayList();
StreamReader stream = new StreamReader(iniPath, System.Text.Encoding.Default);
string section = "" ;
while (stream.Peek() != - 1 )
{
string str = stream.ReadLine().Trim();
// 判断该行是否有数据
if (str.Length > 0 )
{
// 以“;”开头的行为注释行(硬性规定)
if (str.Substring( 0 , 1 ) != " ; " )
{
// 以“[“开头的行为Section行(硬性规定)
if (str.Substring( 0 , 1 ) == " [ " )
{
// 记录当前Section
section = str.Substring( 1 , str.IndexOf( " ] " ) - 1 );
}
// 有“=”的为数据行(硬性规定)
if (str.IndexOf( " = " ) > 0 )
{
string [] temp = str.Split( ' = ' );
// 将该数据行的属性添加到列表
propertyList.Add( new Property(section, temp[ 0 ].Trim(), temp[ 1 ].Trim(), "" ));
}
}
else
{
// 将注释行的属性添加到列表
propertyList.Add( new Property(section, "" , "" , str));
}
}
else
{
// 为保证格式与加载前相同,因些将空行也加入了列表
propertyList.Add( new Property( "" , "" , "" , "" ));
}
}
stream.Close();
isLoad = true ;
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isLoad;
}
/// <summary>
/// 将列表中的配置信息保存到INI文件
/// </summary>
/// <returns> 保存是否成功 </returns>
private bool SaveIni()
{
bool isSave = false ;
try
{
StreamWriter stream = new StreamWriter(iniPath, false , System.Text.Encoding.Default);
string section = "" ;
for ( int i = 0 ; i < propertyList.Count; i ++ )
{
Property p = (Property)propertyList[i];
// 写入Section
if (p.Section != "" && p.Section != section)
{
section = p.Section;
stream.WriteLine( " [ " + section + " ] " );
}
// 写入注释
if (p.Description != "" )
{
stream.WriteLine(p.Description);
}
// 写入键和键值
if (p.Key != "" )
{
stream.WriteLine(p.Key + " = " + p.Value);
}
// 写入空行
if (p.Section == "" && p.Description == "" )
{
stream.WriteLine( "" );
}
}
stream.Close();
isSave = true ;
}
catch (Exception ex)
{
Debug.Print(ex.Message);
}
return isSave;
}
/// <summary>
/// 内部类:Ini属性
/// </summary>
private class Property
{
string section = "" ;
/// <summary>
/// 节点
/// </summary>
public string Section
{
get { return section; }
set { section = value; }
}
string key = "" ;
/// <summary>
/// 键
/// </summary>
public string Key
{
get { return key; }
set { key = value; }
}
string value = "" ;
/// <summary>
/// 键值
/// </summary>
public string Value
{
get { return this .value; }
set { this .value = value; }
}
string description = "" ;
/// <summary>
/// 注释
/// </summary>
public string Description
{
get { return description; }
set { description = value; }
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="description"></param>
public Property( string section, string key, string value, string description)
{
this .Section = section;
this .Key = key;
this .Value = value;
this .Description = description;
}
}
#endregion
}
}
接下来再写个使用注册表的配置类
http://xingfustar.cnblogs.com