/*********************************************************************** * Copyright(c) 2011 FK * CLR 版本: 2.0.50727.3615 * 文 件 名:RWIniFile.cs * 创 建 人:FK * 创建日期:2011-04-08 17:39:40 * 修 改 人: * 修改日期: * 备注描述:操作配置文件 ************************************************************************/ using System; using System.IO; using System.Runtime.InteropServices; using System.Text; namespace Kingsense.eMenu.Common { /// <summary> /// 配置文件(*.int)操作类 /// </summary> public class RWIniFile { #region 声明读写配置文件的API函数 /// <summary> /// 写配置文件 /// </summary> /// <param name="section">节(如果该节不存在,则创建它)</param> /// <param name="key">键(该键不存在于指定的部分,它被创建。 如果这个参数为NULL,则整节被删除)</param> /// <param name="val">值(如果这个参数为NULL,则删除该键)</param> /// <param name="filePath">文件路径</param> /// <returns>写入成功,则返回非零值。如果函数失败或者只是刷新最近访问的缓冲区版本,返回值为零</returns> [DllImport("kernel32")] private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath); /// <summary> /// 读配置文件 /// </summary> /// <param name="section">节(当值为NULL时,读取全部节)</param> /// <param name="key">键(当值为NULL时,读取全部键)</param> /// <param name="defaultVal">默认值(键不存在时,返回该值。当值为NULL时,则往缓冲区中写入空字符串"",避免该值为"")</param> /// <param name="returnVal">缓冲区,它接收检索到的字符串的指针</param> /// <param name="size">缓冲区的大小</param> /// <param name="filePath">文件的路径</param> /// <returns>复制到缓冲区,不包括终止空字符的字符数</returns> [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string defaultVal, StringBuilder returnVal, int size, string filePath); #endregion #region 成员变量 private string fileName; //INI文件名 #endregion #region 属性 /// <summary> /// INI文件名 /// </summary> public string FileName { set { fileName = string.IsNullOrEmpty(value) ? "my.ini" : value; // 判断文件是否存在 FileInfo fileInfo = new FileInfo(fileName); if ((!fileInfo.Exists)) { //文件不存在,建立文件 StreamWriter sw = new StreamWriter(fileName, false, Encoding.Default); try { sw.Close(); } catch (Exception) { throw (new ApplicationException("Ini文件不存在")); } } //必须是完全路径,不能是相对路径 fileName = fileInfo.FullName; } } #endregion #region 构造函数 private RWIniFile() { fileName = string.Empty; } #endregion #region 限制只能有一个对象 private static readonly RWIniFile instance = new RWIniFile();//菜单操作对象 public static RWIniFile Instance { get { return instance; } } #endregion #region 写字符串 /// <summary> /// 写写字符串 /// </summary> /// <param name="section">节</param> /// <param name="key">键</param> /// <param name="value">值</param> public void WriteString(string section, string key, string value) { try { WritePrivateProfileString(section, key, value, fileName); } catch (Exception) { throw (new Exception("写入Ini文件出错")); } } #endregion #region 读字符串 /// <summary> /// 读字符串(最大可以读500个字符) /// </summary> /// <param name="section">节</param> /// <param name="key">键</param> /// <param name="defaultVal">值</param> /// <returns>返回指定节指定键的值</returns> public string ReadString(string section, string key, string defaultVal) { StringBuilder temp = new StringBuilder(500); try { GetPrivateProfileString(section, key, defaultVal, temp, 500, fileName); } catch (Exception) { throw (new Exception("读取Ini文件出错")); } return temp.ToString(); } #endregion #region 读整数 /// <summary> /// 读整数 /// </summary> /// <param name="section">节</param> /// <param name="key">键</param> /// <param name="defaultVal">默认值</param> /// <returns>返回指定节指定键的值</returns> public int ReadInteger(string section, string key, int defaultVal) { string result = ReadString(section, key, Convert.ToString(defaultVal)); try { return Convert.ToInt32(result); } catch (Exception) { throw (new Exception("该键的值不是整数!")); } } #endregion #region 写整数 /// <summary> /// 写整数 /// </summary> /// <param name="section">节</param> /// <param name="key">键</param> /// <param name="value">值</param> public void WriteInteger(string section, string key, int value) { WriteString(section, key, value.ToString()); } #endregion #region 读布尔 /// <summary> /// 读布尔 /// </summary> /// <param name="section">节</param> /// <param name="key">键</param> /// <param name="defaultVal">默认值</param> /// <returns></returns> public bool ReadBool(string section, string key, bool defaultVal) { string result = ReadString(section, key, Convert.ToString(defaultVal)); try { return Convert.ToBoolean(result); } catch (Exception) { throw (new Exception("该键的值不是布尔值!")); } } #endregion #region 写Bool /// <summary> /// 写Bool /// </summary> /// <param name="section"></param> /// <param name="key"></param> /// <param name="value"></param> public void WriteBool(string section, string key, bool value) { WriteString(section, key, Convert.ToString(value)); } #endregion #region 删除节 /// <summary> /// 删除节 /// </summary>k /// <param name="section">节</param> public void DeleteSection(string section) { try { WritePrivateProfileString(section, null, null, fileName); } catch (Exception) { throw (new Exception("无法清除Ini文件中的节")); } } #endregion #region 删除节下的键 /// <summary> /// 删除节下的键 /// </summary> /// <param name="section">节</param> /// <param name="key">键</param> public void DeleteKey(string section, string key) { WritePrivateProfileString(section, key, null, fileName); } #endregion #region 更新缓冲区 /// <summary> /// 更新缓冲区(1、对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件2、在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile3、执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。) /// </summary> public void UpdateFile() { WritePrivateProfileString(null, null, null, fileName); } #endregion #region 析构函数 /// <summary> /// 更新缓冲区 /// </summary> ~RWIniFile() { UpdateFile(); } #endregion } }