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, 2000XP上,都是直接写文件,没有缓冲,所以,无须实现 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#,职场,休闲)