[原创]C#不调用API读写INI文件类

刚写完读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

转载于:https://www.cnblogs.com/XingfuStar/archive/2007/09/13/891950.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值