好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#读写INI文件的方法

本文实例讲述了C#读写INI文件的方法。分享给大家供大家参考。具体如下:

虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中。

INI文件是文本文件,由若干节(section)组成,在每个带括号的标题下面,是若干个关键词(key)及其对应的值(Value)

[Section]
Key=Value

VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面是一个C# ini文件读写类,从网上收集的,很全,就是没有对section的改名功能,高手可以增加一个。

using System;

using System.IO;

using System.Runtime.InteropServices;

using System.Text;

using System.Collections;

using System.Collections.Specialized;

namespace wuyisky

{

  /// <summary>

  /// IniFiles的类

  /// </summary>

  public class IniFiles

  {

   public string FileName; //INI文件名

   //声明读写INI文件的API函数

   [DllImport( "kernel32" )]

   private static extern bool WritePrivateProfileString( string section, string key, string val, string filePath);

   [DllImport( "kernel32" )]

   private static extern int GetPrivateProfileString( string section, string key, string def, byte [] retVal, int size, string filePath);

   //类的构造函数,传递INI文件名

   public IniFiles( string AFileName)

   {

    // 判断文件是否存在

    FileInfo fileInfo = new FileInfo(AFileName);

    //Todo:搞清枚举的用法

    if ((!fileInfo.Exists))

    { //|| (FileAttributes.Directory in fileInfo.Attributes))

     //文件不存在,建立文件

     System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName, false , System.Text.Encoding.Default);

     try

     {

      sw.Write( "#表格配置档案" );

      sw.Close();

     }

     catch

     {

      throw ( new ApplicationException( "Ini文件不存在" ));

     }

    }

    //必须是完全路径,不能是相对路径

    FileName = fileInfo.FullName;

   }

   //写INI文件

   public void WriteString( string Section, string Ident, string Value)

   {

    if (!WritePrivateProfileString(Section, Ident, Value, FileName))

    {

     throw ( new ApplicationException( "写Ini文件出错" ));

    }

   }

   //读取INI文件指定

   public string ReadString( string Section, string Ident, string Default)

   {

    Byte[] Buffer = new Byte[65535];

    int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);

    //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文

    string s = Encoding.GetEncoding(0).GetString(Buffer);

    s = s.Substring(0, bufLen);

    return s.Trim();

   }

   //读整数

   public int ReadInteger( string Section, string Ident, int Default)

   {

    string intStr = ReadString(Section, Ident, Convert.ToString(Default));

    try

    {

     return Convert.ToInt32(intStr);

    }

    catch (Exception ex)

    {

     Console.WriteLine(ex.Message);

     return Default;

    }

   }

   //写整数

   public void WriteInteger( string Section, string Ident, int Value)

   {

    WriteString(Section, Ident, Value.ToString());

   }

   //读布尔

   public bool ReadBool( string Section, string Ident, bool Default)

   {

    try

    {

     return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default)));

    }

    catch (Exception ex)

    {

     Console.WriteLine(ex.Message);

     return Default;

    }

   }

   //写Bool

   public void WriteBool( string Section, string Ident, bool Value)

   {

    WriteString(Section, Ident, Convert.ToString(Value));

   }

   //从Ini文件中,将指定的Section名称中的所有Ident添加到列表中

   public void ReadSection( string Section, StringCollection Idents)

   {

    Byte[] Buffer = new Byte[16384];

    //Idents.Clear();

    int bufLen = GetPrivateProfileString(Section, null , null , Buffer, Buffer.GetUpperBound(0),

      FileName);

    //对Section进行解析

    GetStringsFromBuffer(Buffer, bufLen, Idents);

   }

   private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings)

   {

    Strings.Clear();

    if (bufLen != 0)

    {

     int start = 0;

     for ( int i = 0; i < bufLen; i++)

     {

      if ((Buffer[i] == 0) && ((i - start) > 0))

      {

       String s = Encoding.GetEncoding(0).GetString(Buffer, start, i - start);

       Strings.Add(s);

       start = i + 1;

      }

     }

    }

   }

   //从Ini文件中,读取所有的Sections的名称

   public void ReadSections(StringCollection SectionList)

   {

    //Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section

    byte [] Buffer = new byte [65535];

    int bufLen = 0;

    bufLen = GetPrivateProfileString( null , null , null , Buffer,

     Buffer.GetUpperBound(0), FileName);

    GetStringsFromBuffer(Buffer, bufLen, SectionList);

   }

   //读取指定的Section的所有Value到列表中

   public void ReadSectionValues( string Section, NameValueCollection Values)

   {

    StringCollection KeyList = new StringCollection();

    ReadSection(Section, KeyList);

    Values.Clear();

    foreach ( string key in KeyList)

    {

     Values.Add(key, ReadString(Section, key, "" ));

    }

   }

   ////读取指定的Section的所有Value到列表中,

   //public void ReadSectionValues(string Section, NameValueCollection Values,char splitString)

   //{  string sectionValue;

   //  string[] sectionValueSplit;

   //  StringCollection KeyList = new StringCollection();

   //  ReadSection(Section, KeyList);

   //  Values.Clear();

   //  foreach (string key in KeyList)

   //  {

   //    sectionValue=ReadString(Section, key, "");

   //    sectionValueSplit=sectionValue.Split(splitString);

   //    Values.Add(key, sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString());

   //  }

   //}

   //清除某个Section

   public void EraseSection( string Section)

   {

    if (!WritePrivateProfileString(Section, null , null , FileName))

    {

     throw ( new ApplicationException( "无法清除Ini文件中的Section" ));

    }

   }

   //删除某个Section下的键

   public void DeleteKey( string Section, string Ident)

   {

    WritePrivateProfileString(Section, Ident, null , FileName);

   }

   //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件

   //在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile

   //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。

   public void UpdateFile()

   {

    WritePrivateProfileString( null , null , null , FileName);

   }

   //检查某个Section下的某个键值是否存在

   public bool ValueExists( string Section, string Ident)

   {

    StringCollection Idents = new StringCollection();

    ReadSection(Section, Idents);

    return Idents.IndexOf(Ident) > -1;

   }

   //确保资源的释放

   ~IniFiles()

   {

    UpdateFile();

   }

  }

}

目前C# 对ini文件操作基本上要被xml文件取代了,但是我觉得ini文件的读写仍然是编程的基本,是必须会的

希望本文所述对大家的C#程序设计有所帮助。

dy("nrwz");

查看更多关于C#读写INI文件的方法的详细内容...

  阅读:71次