操作Ini的类[转]

在写操作INI文件是找到的.好像是Windows live上的。具体谁的不记得了。


//使用方法 
//获得某一Section下所有内容
//IniConfig config = new IniConfig();
//config.Open( filePath );
//int count = config.GetContinueDataNum( "Section" );
//string [] myStrings = new string[count];
//for( int i = 0;i < count;i++ )
//{
//myStrings[i] = config.ReadText( "Section", i );
//}
 
public class IniConfig
 
{
  
Fields
  
Properties
  
Methods
  
public IniConfig()
  
{
   length 
= 0;
   IndexNum 
= 0;
   IndexList
=null;
  }

  
public IniConfig( String filePath )
  
{
   length 
= 0;
   IndexNum 
= 0;
   IndexList 
= null;
   Open( filePath );
  }

  
public void Open( String filePath )
  
{
   data.Length 
= 0;
   
this.filePath = filePath;
   
if ( filePath != null && filePath.Length > 0 )
   
{
    
int fileLength = 0;
    
byte[] dataByte;
    Stream stream 
= null;
    MemoryStream memoryStream 
= null;
    
try
    
{
     FileInfo fileInfo 
= new FileInfo( filePath );
     fileLength 
= Convert.ToInt32( fileInfo.Length );
     dataByte 
= new byte[ fileLength ];
     stream 
= fileInfo.OpenRead();
     memoryStream 
= new MemoryStream();
     
byte[] bs = new byte[256];
     
for ( int j = stream.Read( bs, 0, ( int ) bs.Length ); j > 0; j = stream.Read( bs, 0, ( int ) bs.Length ) )
     
{
      memoryStream.Write( bs, 
0, j );
     }

     memoryStream.Position 
= ( long ) 0;
     dataByte 
= memoryStream.GetBuffer();
     data.Append( Tool.ByteArrayToString( dataByte ) );
     length 
= data.Length;
     InitIndex();
    }

    
catch ( System.Exception e )
    
{
     length 
= 1;
     data.Append( 
0 );
     InitIndex();
     
throw e;
    }

    
finally
    
{
     stream.Close();
     memoryStream.Close();
    }

   }

  }

  
// 计算出所有的索引位置
  private void InitIndex()
  
{
   indexNum
=0;
   
for(int i=0; i<length; i++)
   
{
    
//找到,要以[开头,而且段与段之间要用回车分开
    if( ( char ) data[i]=='[' && (i==0||(i>0&& ( char ) data[i-1]==' ')))
    
{
     indexNum
++;
    }

   }

   
//  申请内存
   IndexList=null;
   
if( indexNum>0 )
    indexList
=new int[indexNum];
  
   
int n=0;
   
//初始化
   for(int i=0; i<length; i++)
   
{
    
if( ( char ) data[i]=='[' && ((i>0&& ( char ) data[i-1]==' ' )|| i==0) )
    
{
     indexList[n]
=i+1;  //保存到索引表的位置是 [ 的下一个字符的位置
     n++;
    }

   }

  }

 
  
// 返回指定标题位置
  public int FindIndex(String title)
  
{
   String titleName;
   
for(int i=0; i<IndexNum; i++)
   
{
    titleName
=ReadText(IndexList[i]);  //遍历索引表,读所有的索引
    
//   System.out.println(titleName);
    if( titleName.ToLower().Trim() == title.ToLower().Trim() )   //比较,如果相同就返回标题的位置
    {
     titleName
="";
     
return IndexList[i];    //索引所在的位置,是 [ 的字符的下一个位置
    }

    titleName
="";
   }

   
return -1;
  }

 
  
// 返回指定了标题和数据的内容的该数据内容所在的位置
  private int FindData(int index, String key )
  
{
   
//int p=index.intValue(); //指针
   String name;
   
bool isNotFind=true;
   
int p=index;
  
   
while(isNotFind)
   
{         //跳过标题(索引)所在的行
    p=GotoNextLine(p);    //下一行的位置
    if (p==-1)      //如果已经到达文件末尾,就是没找到
     return -1;
    name
=ReadDataName(p);  //读一个名字,注意p在C++中是按地址的方式传参的(也就是p可能在这个函数中被改动了,在Java中要想别的办法解决,这里使用getAfterReadDataName方法解决或Integer包装类解决)
    p=getAfterReadDataName(p);//如果Integer包装类无法使用,就用原来的办法
    
//   System.out.println(name);
    if( key.ToLower().Trim() == name.ToLower().Trim() ) //相同就返回位置,数据内容开始的位置
    {
     name
=null;
     isNotFind
=false;
     
return p;
    }

    name
=null;
    
if( p>=length ) return -1;  //没有找到
   }

   
return -1;
  }

  
private String ReadText(int p)
  
{
   
char chr;
   StringBuilder Ret
=new StringBuilder("");
   
int n=p;
   
int EndLine=GotoNextLine(p);
   
for(int i=0; i<length-p; i++)
   
{
    chr
= ( char ) Data[n];
    
//结束   用分号,回车,TAB或者是]结束(没有空格,所以脚本结束处也不允许出现空格,否则会出错)
    if( chr == ';' || chr == ' ' || chr == ' ' || chr == ']' )
    
{
     
return Ret.ToString();
    }

    Ret.Append(chr);  
//读入到缓冲区
    n++;
   }

   
return Ret.ToString();
  }

  
private int GotoNextLine(int p)
  
{
   
for(int i=p; i<length; i++)
   
{
    
if( ( char ) Data[i]==' ' )    //回车换行
     return i+1;
   }

   
return -1;
  }

  
// 在指定位置读一数据名称
  private String ReadDataName(int p)   //引用参数,将通过p返回,而其值是
  {           //数据的内容的位置
   char chr;
   StringBuilder Ret
=new StringBuilder("");
  
   
for(int i=p; i<length; i++)
   
{
   
    chr
= ( char ) Data[i];
    
//结束
    if( chr == ' ' )
    
{
     
return Ret.ToString();
    }

   
    
//结束
    if( chr == '=' || chr == ';' )
    
{
     
return Ret.ToString();
    }

   
    Ret.Append(chr);
   }

   
//  System.out.println(Ret.ToString());
   return Ret.ToString();
  }

  
//原创,返回制定位置读完一数据名称后索引所在位置,如果使用Integer包装类无法代替引用,需要此函数
  private int getAfterReadDataName(int p)
  
{
   
char chr;
   
for(int i=p; i<length; i++)
   
{
    chr
= ( char ) Data[i];
    
//结束
    if( chr == ' ' )
    
{
     p
=i+1;   
     
return p;
    }

   
    
//结束
    if( chr == '=' || chr == ';' )
    
{
     p
=i+1;      //指向数据的内容,跳过了分隔符
     return p;
    }

   
   }

   
return p;
  }

 
  
/////////////////////////////////////////////////////////////////////
  //
  //////////////////////////////////////////////////////////////////// /
  // 以普通方式读一字符串数据
  public String ReadText(String index, String name)
  
{
   
//  return iniHelper.IniReadValue( index, name, this.FileName );
   int n=FindIndex(index);    //通过索引名字找到位置
   if( n == -1 )
   
{
    
//   System.out.println("Can't find "+ index + " in file '"+ FileName + "'!");
    return "";
   }

   
int m=FindData(n, name);   //通过索引的位置和数据名字找到数据内容的位置
   if( m==-1 )
   
{
    
//   System.out.println("Can't find"+ name + "in file '"+ FileName + "'!");
    return "";
   }

   
return ReadText(m);     //读出该内容
  }

 
  
// 在指定的行读一字符串,设计这个函数是用于读出一批数据,
  
// 而且可以不关心具体的名字,可以用循环的方式读
  public String ReadText(String index, int lines)
  
{
   
int n=FindIndex(index);    //通过索引名字找到位置
   if( n == -1 )
   
{
    
//   System.out.println("Can't find"+ index + "in file '"+ FileName + "'!");
    return "";
   }

   
//跳到指定行数
   n=GotoNextLine(n);
   
for(int i=0; i<lines; i++)
   
{
    
if( n<length )
     n
=GotoNextLine(n);
   }

   
//读数据
   while( n<=length )
   
{
    
if( ( char )Data[n] == '=' )  //找到分隔符 =
    {
     n
++;     //移动到=的下一个字符
     return ReadText(n);  //读出内容
    }

    
if( ( char ) Data[n] == ' ' )
    
{
     
return "";    //没有找到
    }

    n
++;
   }

   
return "";
  }

 
  
// 以普通方式读一整数数据
  public int ReadInt(String index, String name)
  
{
   
int n=FindIndex(index);   //…………
   if( n == -1 )
   
{
    
//   System.out.println("Can't find"+ index + "in file '"+ FileName + "'!");
    return -1;
   }

  
   
int m=FindData(n, name);  //看看上面的注释
   if( m==-1 )
   
{
    
//   System.out.println("Can't find"+ name + "in file '"+ FileName + "'!");
    return -1;
   }

   String str
=ReadText(m);   //………………
  
   
int ret=Convert.ToInt32(str);
   str
=null;
   
return ret;
   
//  return Convert.ToInt32( iniHelper.IniReadValue( index, name, this.FileName ) );
  }

 
  
// 在指定的行读一整数,同样是为了成批的读取,而且可以不关心具体的名字
  public int ReadInt(String index, int lines)
  
{
   
int n=FindIndex(index);   //不想多说了
   if( n == -1 )
   
{
    
//   System.out.println("Can't find"+ index + "in file '"+ FileName + "'!");
    return -1;
   }

   
//跳到指定行数
   n=GotoNextLine(n);
   
for(int i=0; i<lines; i++)
   
{
    
if( n<length )
     n
=GotoNextLine(n);
   }

   
//读数据
   while( n<length )
   
{
    
if( ( char ) Data[n] == '=' )  //应该是明白了吧,不明白就看看上面的注释
    {
   
     n
++;
     String str
=ReadText(n); //…………
     int ret=Convert.ToInt32(str);
     str
=null;
     
return ret;
    }

    
if( ( char ) Data[n] == ' ' )
    
{
     
return -1;
    }

    n
++;
   }

   
return -1;
  }

  
// 在指定的行读一数据名称,目的…………
 
  
public String ReadData(String index, int lines)
  
{
   
int n=FindIndex(index);   //没有语言了
   if( n == -1 )
   
{
    
//   System.out.println("Can't find"+ index + "in file '"+ FileName + "'!");
    return null;
   }

   
//跳到指定行数
   n=GotoNextLine(n);
   
for(int i=0; i<lines; i++)
   
{
    
if( n<length )
     n
=GotoNextLine(n);
   }

   
return ReadDataName(n);  //读出名字返回
  }

 
  
// 以普通方式写一字符串数据。索引,名字,内容
  public bool WriteText(String index, String name, String keyValue )
  
{
   
int n=FindIndex(index);   //我真的不想说了
   if( n == -1 ) //新建索引
   {
    AddIndex(index);   
//加入一个一个索引
    n=FindIndex(index);   //找到其位置
    AddData(n, name, keyValue ); //在当前位置n加一个数据
    return true;
   }

   
//存在索引
   int m=FindData(n, name);
   
if( m==-1 )  //新建数据
   {
    AddData(n, name,  keyValue ); 
//在当前位置n加一个数据
    return true;
   }

   
//存在数据
   ModifyData(n, name, keyValue.ToString()); //修改一个数据
   return true;
  }

 
  
// 以普通方式写一整数
  public bool WriteInt(String index, String name, int num)
  
{
   StringBuilder sb 
= new StringBuilder("");
  
   sb.Append(num);
   
int n=FindIndex(index);   //……
   if( n == -1 ) //新建索引
   {
    AddIndex(index);   
//看上面的注释
    n=FindIndex(index);
    AddData(n, name, sb.ToString()); 
//在当前位置n加一个数据
    return true;
   }

   
//存在索引
   int m=FindData(n, name);
  
   
if( m==-1 )  //新建数据
   {
    AddData(n, name, sb.ToString()); 
//在当前位置n加一个数据
    return true;
   }

   
//存在数据
   ModifyData(n, name, sb.ToString()); //修改一个数据
   return true;
  }

 
  
/////////////////////////////////////////////////////////////////////
  //
  //////////////////////////////////////////////////////////////////// /
  // 加入一个索引
  private bool AddIndex(String index)
  
{
   StringBuilder str
=new StringBuilder("");
   
int n=FindIndex(index);   //找找看有没有一样的
   if( n == -1 ) //新建索引
   {
    str.Append(
" ["+index+"] ");
   
    
//Data=(char *)realloc(Data, length+strlen(str)); //重新分配内存
    Data.Append(str.ToString());
    length
=Data.Length;     //更新长度
    InitIndex();       //重新建立索引表
    return true;
   }

  
   
return false//已经存在
  }

 
  
// 在当前位置加入一个数据
  private bool AddData(int p, String name, String dataValue )
  
{
   StringBuilder str
=new StringBuilder();
   str.Append(name
+"="+ dataValue +" ");
   p
=GotoNextLine(p); //提行
   Data.Insert(p,str.ToString());
  
   length
=Data.Length;        //更新数据长度
   str=null;
   
return true;
  }

 
  
// 在当前位置修改一个数据的值
  private bool ModifyData(int p, String name, String dataValue )
  
{
  
   
int n=FindData(p, name);     //找到数据。注意:返回的n是内容的位置
   String t=ReadText(n);      //读出数据的内容
   
//  p=n+t.Length;        //移动到数据的末尾的下一个位置
  
   
int oldlen=t.Length;        //t的长度,也就是原来的数据长度
   t=null;
   
//Data=(char *)realloc(Data, length+newlen-oldlen); //重新分配内存
   length=Data.Length;
   Data.Remove(n,n
+oldlen);         //删除原来的内容
   length=Data.Length;
  
   Data.Insert(n,dataValue);
   length
=Data.Length;        //更新数据长度
   return true;
  }

 
  
// 返回文件内容
  /*
  public String GetData()
  {
   return Data.ToString();
  }
  
*/

  
public void output()
  
{
   
//  System.out.println(Data.ToString());
  }

  
// 获得文件的行数
  public int GetLines(int cur)
  
{
   
int n=1;
   
for(int i=0; i<cur; i++)
   
{
    
if( ( char ) Data[i]==' ' )     //找到,就是新的一行
     n++;
   }

   
return n;
  }

 
  
// 返回连续的行数,就是标题(索引)这个段共有多少行,一般是用来循环记数的
  public int GetContinueDataNum(String index)
  
{
   
int num=0;
   
int n=FindIndex(index);    //恩…………
   n=GotoNextLine(n);     //跳过标题(索引)
   while(true)
   
{         //要是一行的开头就是下面的字符的话,就结束(没加||Data.charAt(n) == EOF,因为EOF=-1)
    
//   if( ( char ) Data[n] == ' ' || ( char ) Data[n] == -3  || ( char ) Data[n] ==  -1
    
//    || ( char )Data[n] == ' ' || ( char ) Data[n] == '/' || ( char ) Data[n] == ' ' || ( char ) Data[n] == ' ' )
    if( ( char ) Data[n] == ' ' || ( char )Data[n] == ' ' || ( char ) Data[n] == '/' || ( char ) Data[n] == ' ' || ( char ) Data[n] == ' ' )
    
{
     
return num;
    }

    
else
    
{
     num
++;      //加一
     n=GotoNextLine(n);   //到下一行的开头
     if( n >= length ) 
      
return num;   //文件结束
    }

   }

  }

  
public void Clear()
  
//清空数据
   length=0;
   IndexNum
=0;
   IndexList
=null;
   Data.Length 
= 0;
  }

 }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值