在写操作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#region Fields
private string filePath;
private int length;
private StringBuilder data = new StringBuilder();
private int indexNum; //索引数目([]的数目)
private int[] indexList; //索引点位置列表
private int point; //当前指针
private int line, word; //当前行列
#endregion

Properties#region Properties
public string FilePath

...{
get

...{
return filePath;
}
set

...{
filePath = value;
}
}
public int Length

...{
get

...{
return length;
}
set

...{
length = value;
}
}
public StringBuilder Data

...{
get

...{
return data;
}
set

...{
data = value;
}
}
public int IndexNum

...{
get

...{
return indexNum;
}
set

...{
indexNum = value;
}
}
public int[] IndexList

...{
get

...{
return indexList;
}
set

...{
indexList = value;
}
}
public int Point

...{
get

...{
return point;
}
set

...{
point = value;
}
}
public int Line

...{
get

...{
return line;
}
set

...{
line = value;
}
}
public int Word

...{
get

...{
return word;
}
set

...{
word = value;
}
}
#endregion

Methods#region Methods
#endregion
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;
}
}