C#操作INI文件的辅助类IniHelper

使用INI配置文件,简单便捷。

该辅助工具类为C#操作INI文件的辅助类,源码在某位师傅的基础上完善的来,因为忘记最初的来源了,因此不能提及引用,在此深感遗憾,并对贡献者表示感谢。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace Eyuan.Common
{
 public static class INIHelper
 {

  #region 读写INI文件相关
  [DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString", CharSet = CharSet.Ansi)]
  private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

  [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString", CharSet = CharSet.Ansi)]
  private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

  [DllImport("kernel32")]
  private static extern int GetPrivateProfileInt(string lpApplicationName, string lpKeyName, int nDefault, string lpFileName);

  [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileSectionNames", CharSet = CharSet.Ansi)]
  private static extern int GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, int nSize, string filePath);

  [DllImport("KERNEL32.DLL ", EntryPoint = "GetPrivateProfileSection", CharSet = CharSet.Ansi)]
  private static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string filePath);
  #endregion

  #region 读写操作(字符串)
  /// <summary>
  /// 向INI写入数据
  /// </summary>
  /// <PARAM name="Section">节点名</PARAM>
  /// <PARAM name="Key">键名</PARAM>
  /// <PARAM name="Value">值(字符串)</PARAM>
  public static void Write(string Section, string Key, string Value, string path)
  {
   WritePrivateProfileString(Section, Key, Value, path);
  }
  /// <summary>
  /// 读取INI数据
  /// </summary>
  /// <PARAM name="Section">节点名</PARAM>
  /// <PARAM name="Key">键名</PARAM>
  /// <PARAM name="Path">值名</PARAM>
  /// <returns>值(字符串)</returns>
  public static string Read(string Section, string Key, string path)
  {
   StringBuilder temp = new StringBuilder(255);
   int i = GetPrivateProfileString(Section, Key, "", temp, 255, path);
   return temp.ToString();
  }
  #endregion

  #region 配置节信息
  /// <summary>
  /// 读取一个ini里面所有的节
  /// </summary>
  /// <param name="sections"></param>
  /// <param name="path"></param>
  /// <returns>-1:没有节信息,0:正常</returns>
  public static int GetAllSectionNames(out string[] sections, string path)
  {
   int MAX_BUFFER = 32767;
   IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
   int bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, path);
   if (bytesReturned == 0)
   {
    sections = null;
    return -1;
   }
   string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
   Marshal.FreeCoTaskMem(pReturnedString);
   //use of Substring below removes terminating null for split
   sections = local.Substring(0, local.Length - 1).Split('\0');
   return 0;
  }
  /// <summary>
  /// 返回指定配置文件下的节名称列表
  /// </summary>
  /// <param name="path"></param>
  /// <returns></returns>
  public static List<string> GetAllSectionNames(string path)
  {
   List<string> sectionList = new List<string>();
   int MAX_BUFFER = 32767;
   IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
   int bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, path);
   if (bytesReturned != 0)
   {
    string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
    Marshal.FreeCoTaskMem(pReturnedString);
    sectionList.AddRange(local.Substring(0, local.Length - 1).Split('\0'));
   }
   return sectionList;
  }

  /// <summary>
  /// 得到某个节点下面所有的key和value组合
  /// </summary>
  /// <param name="section">指定的节名称</param>
  /// <param name="keys">Key数组</param>
  /// <param name="values">Value数组</param>
  /// <param name="path">INI文件路径</param>
  /// <returns></returns>
  public static int GetAllKeyValues(string section, out string[] keys, out string[] values, string path)
  {
   byte[] b = new byte[65535];//配置节下的所有信息
   GetPrivateProfileSection(section, b, b.Length, path);
   string s = System.Text.Encoding.Default.GetString(b);//配置信息
   string[] tmp = s.Split((char)0);//Key\Value信息
   List<string> result = new List<string>();
   foreach (string r in tmp)
   {
    if (r != string.Empty)
     result.Add(r);
   }
   keys = new string[result.Count];
   values = new string[result.Count];
   for (int i = 0; i < result.Count; i++)
   {
    string[] item = result[i].Split(new char[] { '=' });//Key=Value格式的配置信息
    //Value字符串中含有=的处理,
    //一、Value加"",先对""处理
    //二、Key后续的都为Value
    if (item.Length > 2)
    {
     keys[i] = item[0].Trim();
     values[i] = result[i].Substring(keys[i].Length + 1);
    }
    if (item.Length == 2)//Key=Value
    {
     keys[i] = item[0].Trim();
     values[i] = item[1].Trim();
    }
    else if (item.Length == 1)//Key=
    {
     keys[i] = item[0].Trim();
     values[i] = "";
    }
    else if (item.Length == 0)
    {
     keys[i] = "";
     values[i] = "";
    }
   }
   return 0;
  }
  /// <summary>
  /// 得到某个节点下面所有的key
  /// </summary>
  /// <param name="section">指定的节名称</param>
  /// <param name="keys">Key数组</param>
  /// <param name="path">INI文件路径</param>
  /// <returns></returns>
  public static int GetAllKeys(string section, out string[] keys, string path)
  {
   byte[] b = new byte[65535];

   GetPrivateProfileSection(section, b, b.Length, path);
   string s = System.Text.Encoding.Default.GetString(b);
   string[] tmp = s.Split((char)0);
   ArrayList result = new ArrayList();
   foreach (string r in tmp)
   {
    if (r != string.Empty)
     result.Add(r);
   }
   keys = new string[result.Count];
   for (int i = 0; i < result.Count; i++)
   {
    string[] item = result[i].ToString().Split(new char[] { '=' });
    if (item.Length == 2)
    {
     keys[i] = item[0].Trim();
    }
    else if (item.Length == 1)
    {
     keys[i] = item[0].Trim();
    }
    else if (item.Length == 0)
    {
     keys[i] = "";
    }
   }
   return 0;
  }
  /// <summary>
  /// 获取指定节下的Key列表
  /// </summary>
  /// <param name="section">指定的节名称</param>
  /// <param name="path">配置文件名称</param>
  /// <returns>Key列表</returns>
  public static List<string> GetAllKeys(string section, string path)
  {
   List<string> keyList = new List<string>();
   byte[] b = new byte[65535];
   GetPrivateProfileSection(section, b, b.Length, path);
   string s = System.Text.Encoding.Default.GetString(b);
   string[] tmp = s.Split((char)0);
   List<string> result = new List<string>();
   foreach (string r in tmp)
   {
    if (r != string.Empty)
     result.Add(r);
   }
   for (int i = 0; i < result.Count; i++)
   {
    string[] item = result[i].Split(new char[] { '=' });
    if (item.Length == 2 || item.Length == 1)
    {
     keyList.Add(item[0].Trim());
    }
    else if (item.Length == 0)
    {
     keyList.Add(string.Empty);
    }
   }
   return keyList;
  }
  /// <summary>
  /// 获取值
  /// </summary>
  /// <param name="section"></param>
  /// <param name="path"></param>
  /// <returns></returns>
  public static List<string> GetAllValues(string section, string path)
  {
   List<string> keyList = new List<string>();
   byte[] b = new byte[65535];
   GetPrivateProfileSection(section, b, b.Length, path);
   string s = System.Text.Encoding.Default.GetString(b);
   string[] tmp = s.Split((char)0);
   List<string> result = new List<string>();
   foreach (string r in tmp)
   {
    if (r != string.Empty)
     result.Add(r);
   }
   for (int i = 0; i < result.Count; i++)
   {
    string[] item = result[i].Split(new char[] { '=' });
    if (item.Length == 2 || item.Length == 1)
    {
     keyList.Add(item[1].Trim());
    }
    else if (item.Length == 0)
    {
     keyList.Add(string.Empty);
    }
   }
   return keyList;
  }

  #endregion

  #region 通过值查找键(一个节中的键唯一,可能存在多个键值相同,因此反查的结果可能为多个)

  /// <summary>
  /// 第一个键
  /// </summary>
  /// <param name="section"></param>
  /// <param name="path"></param>
  /// <param name="value"></param>
  /// <returns></returns>
  public static string GetFirstKeyByValue(string section, string path, string value)
  {
   foreach (string key in GetAllKeys(section, path))
   {
    if (ReadString(section, key, "", path) == value)
    {
     return key;
    }
   }
   return string.Empty;
  }
  /// <summary>
  /// 所有键
  /// </summary>
  /// <param name="section"></param>
  /// <param name="path"></param>
  /// <param name="value"></param>
  /// <returns></returns>
  public static List<string> GetKeysByValue(string section, string path, string value)
  {
   List<string > keys = new List<string>();
   foreach (string key in GetAllKeys(section, path))
   {
    if (ReadString(section, key, "", path) == value)
    {
     keys.Add(key);
    }
   }
   return keys;
  }
  #endregion

  #region 具体类型的读写

  #region string
  /// <summary>
  ///
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="keyName"></param>
  /// <param name="defaultValue" />
  /// <param name="path"></param>
  /// <returns></returns>
  public static string ReadString(string sectionName, string keyName, string defaultValue, string path)
  {
   const int MAXSIZE = 255;
   StringBuilder temp = new StringBuilder(MAXSIZE);
   GetPrivateProfileString(sectionName, keyName, defaultValue, temp, 255, path);
   return temp.ToString();
  }

  /// <summary>
  ///
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="keyName"></param>
  /// <param name="value"></param>
  /// <param name="path"></param>
  public static void WriteString(string sectionName, string keyName, string value, string path)
  {
   WritePrivateProfileString(sectionName, keyName, value, path);
  }
  #endregion

  #region Int
  /// <summary>
  ///
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="keyName"></param>
  /// <param name="defaultValue"></param>
  /// <param name="path"></param>
  /// <returns></returns>
  public static int ReadInteger(string sectionName, string keyName, int defaultValue, string path)
  {

   return GetPrivateProfileInt(sectionName, keyName, defaultValue, path);

  }
  /// <summary>
  ///
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="keyName"></param>
  /// <param name="value"></param>
  /// <param name="path"></param>
  public static void WriteInteger(string sectionName, string keyName, int value, string path)
  {

   WritePrivateProfileString(sectionName, keyName, value.ToString(), path);

  }
  #endregion

  #region bool
  /// <summary>
  /// 读取布尔值
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="keyName"></param>
  /// <param name="defaultValue"></param>
  /// <param name="path"></param>
  /// <returns></returns>
  public static bool ReadBoolean(string sectionName, string keyName, bool defaultValue, string path)
  {

   int temp = defaultValue ? 1 : 0;

   int result = GetPrivateProfileInt(sectionName, keyName, temp, path);

   return (result == 0 ? false : true);

  }
  /// <summary>
  /// 写入布尔值
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="keyName"></param>
  /// <param name="value"></param>
  /// <param name="path"></param>
  public static void WriteBoolean(string sectionName, string keyName, bool value, string path)
  {
   string temp = value ? "1 " : "0 ";
   WritePrivateProfileString(sectionName, keyName, temp, path);
  }
  #endregion

  #endregion

  #region 删除操作
  /// <summary>
  /// 删除指定项
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="keyName"></param>
  /// <param name="path"></param>
  public static void DeleteKey(string sectionName, string keyName, string path)
  {
   WritePrivateProfileString(sectionName, keyName, null, path);
  }

  /// <summary>
  /// 删除指定节下的所有项
  /// </summary>
  /// <param name="sectionName"></param>
  /// <param name="path"></param>
  public static void EraseSection(string sectionName, string path)
  {
   WritePrivateProfileString(sectionName, null, null, path);
  }
  #endregion

  #region 判断节、键是否存在
  /// <summary>
  /// 指定节知否存在
  /// </summary>
  /// <param name="section"></param>
  /// <param name="fileName"></param>
  /// <returns></returns>
  public static bool ExistSection(string section, string fileName)
  {
   string[] sections = null;
   GetAllSectionNames(out sections, fileName);
   if (sections != null)
   {
    foreach (var s in sections)
    {
     if (s == section)
     {
      return true;
     }
    }
   }
   return false;
  }
  /// <summary>
  /// 指定节下的键是否存在
  /// </summary>
  /// <param name="section"></param>
  /// <param name="key"></param>
  /// <param name="fileName"></param>
  /// <returns></returns>
  public static bool ExistKey(string section, string key, string fileName)
  {
   string[] keys = null;
   GetAllKeys(section, out keys, fileName);
   if (keys != null)
   {
    foreach (var s in keys)
    {
     if (s == key)
     {
      return true;
     }
    }
   }
   return false;
  }
  #endregion

  #region 同一Section下添加多个Key\Value
  /// <summary>
  ///
  /// </summary>
  /// <param name="section"></param>
  /// <param name="keyList"></param>
  /// <param name="valueList"></param>
  /// <param name="path"></param>
  /// <returns></returns>
  public static bool AddSectionWithKeyValues(string section, List<string> keyList, List<string> valueList, string path)
  {
   bool bRst = true;
   //判断Section是否已经存在,如果存在,返回false
   //已经存在,则更新
   //if (GetAllSectionNames(path).Contains(section))
   //{
   // return false;
   //}
   //判断keyList中是否有相同的Key,如果有,返回false

   //添加配置信息
   for (int i = 0; i < keyList.Count; i++)
   {
    WriteString(section, keyList[i], valueList[i], path);
   }
   return bRst;
  }
  #endregion
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • C#中读写INI文件的方法例子
  • c#读写ini配置文件示例
  • C# Ini文件操作实例
  • C#读写INI文件的方法
  • C# Winform 调用系统接口操作 INI 配置文件的代码
  • C#实现读写ini文件类实例
  • C#操作INI配置文件示例详解
  • C#实现利用Windows API读写INI文件的方法
  • c#实现ini文件读写类分享
(0)

相关推荐

  • C#读写INI文件的方法

    本文实例讲述了C#读写INI文件的方法.分享给大家供大家参考.具体如下: 虽然微软早已经建议在WINDOWS中用注册表代替INI文件,但是在实际应用中,INI文件仍然有用武之地,尤其现在绿色软件的流行,越来越多的程序将自己的一些配置信息保存到了INI文件中. INI文件是文本文件,由若干节(section)组成,在每个带括号的标题下面,是若干个关键词(key)及其对应的值(Value) [Section] Key=Value VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程

  • C# Winform 调用系统接口操作 INI 配置文件的代码

    包括了写入和读取功能. 写入的时候, 如果文件不存在会自动创建. 如果对应的键已经存在, 则自动覆盖它的值. 读取的时候, 如果对应的文件不存在, 或者键名不存在, 则返回一个 empty 值. 非常方便 ^_^ 复制代码 代码如下: // 系统接口类 public static class WinAPI { [DllImport("kernel32")] // 写入配置文件的接口 private static extern long WritePrivateProfileString

  • C#实现读写ini文件类实例

    本文实例讲述了C#实现读写ini文件类.分享给大家供大家参考.具体如下: 这个C#类封装了对INI配置文件进行操作所需的各种函数,包括读取键值.读取键值.删除段落等 using System; using System.Runtime.InteropServices; using System.Text; namespace DotNet.Utilities { /// <summary> /// INI文件读写类. /// </summary> public class INIF

  • C# Ini文件操作实例

    在开源中国看到的操作ini文件的,写的还不看,留着以后用 复制代码 代码如下: using System;using System.IO;using System.Runtime.InteropServices;using System.Text;using System.Collections;using System.Collections.Specialized; namespace wuyisky{ /**//**/ /**//// <summary> /// IniFiles的类 /

  • C#中读写INI文件的方法例子

    通常C#使用基于XML的配置文件,不过如果有需要的话,比如要兼顾较老的系统,可能还是要用到INI文件.但C#本身并不具备读写INI文件的API,只有通过调用非托管代码的方式,即系统自身的API才能达到所需的目的. 对应读写的方法分别为GetPrivateProfileString和WritePrivateProfileString. GetPrivateProfileString中的各参数:lpAppName -- section的名称lpKeyName -- key的名称lpDefault -

  • c#实现ini文件读写类分享

    复制代码 代码如下: /// <summary>    /// 读写INI文件的类.    /// </summary>    public class INIHelper    {        // 读写INI文件相关.        [DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString", CharSet = CharSet.Ansi)]        pu

  • C#实现利用Windows API读写INI文件的方法

    本文实例讲述了C#实现利用Windows API读写INI文件的方法.分享给大家供大家参考.具体如下: 写入时,如果没有INI文件,自动创建INI 如果在创建时,GetLastError:5 检查IniPath是否添加了文件名称.ini using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace

  • C#操作INI配置文件示例详解

    本文实例为大家分享了C#操作INI配置文件示例的具体代码,供大家参考,具体内容如下 源文件地址:C#操作INI配置文件示例 创建如图所示的控件: 源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Win

  • c#读写ini配置文件示例

    其他人写的都是调用非托管kernel32.dll.我也用过 但是感觉兼容性有点不好 有时候会出现编码错误,毕竟一个是以前的系统一个是现在的系统.咱来写一个纯C#的ini格式配置文件读取,其实就是文本文件读写啦.但是我们要做的绝不仅仅是这样 是为了访问操作的方便 更是为了以后的使用. 都知道ini格式的配置文件里各个配置项 其实就是一行一行的文本 key跟value 用等号隔开.像这样:grade=5 .各个配置项又进行分组 同类型的放到一起 称之为section 以中括号([])区分.像这样:[

  • C#操作INI文件的辅助类IniHelper

    使用INI配置文件,简单便捷. 该辅助工具类为C#操作INI文件的辅助类,源码在某位师傅的基础上完善的来,因为忘记最初的来源了,因此不能提及引用,在此深感遗憾,并对贡献者表示感谢. using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; namespace Eyuan.Common { pub

  • C#操作ini文件的帮助类

    一.定义Class using System; using System.Runtime.InteropServices; using System.Text; namespace IniDemo { public class IniFile { private string m_FileName; public string FileName { get { return this.m_FileName; } set { this.m_FileName = value; } } [DllImp

  • asp.net操作ini文件示例

    复制代码 代码如下: using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls; using Syste

  • python操作ini类型配置文件的实例教程

    一.ini文件介绍 INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows操作系统中.这种配置文件的文件扩展名多为INI 二.ini文件的结构 片段[section] 键名 option 值 value 三.实例: 实例1 python25.ini [teachers] name = ['yushen', 'pianpian'] age = 16 gender = '女' favor = {"movie": "

  • Python读取ini文件、操作mysql、发送邮件实例

    我是闲的没事干,2014过的太浮夸了,博客也没写几篇,哎~~~ 用这篇来记录即将逝去的2014 python对各种数据库的各种操作满大街都是,不过,我还是喜欢我这种风格的,涉及到其它操作,不过重点还是对数据库的操作.呵~~ Python操作Mysql 首先,我习惯将配置信息写到配置文件,这样修改时可以不用源代码,然后再写通用的函数供调用 新建一个配置文件,就命名为conf.ini,可以写各种配置信息,不过都指明节点(文件格式要求还是较严格的): 复制代码 代码如下: [app_info] DAT

  • C#实现ini文件读写操作

    本文实例为大家分享了C#语言实现ini文件读写操作的具体代码,供大家参考,具体内容如下 1.ini文件是什么? 见百度百科 2.C#语言实现ini文件的读写操作 /// <summary> /// 配置文件 .ini操作类 /// </summary> public class IniFileUtils { /// <summary> /// 写入INI文件 /// </summary> /// <param name="section&qu

  • C/C++ INI文件操作实现代码

    一.INI文件用途: 1.存储程序的初始化信息: 2.存储需要保存的数据信息. 二.INI文件结构: 由节名.键名.键值组成.形式如下: [节名] 键名 = 键值 备注:一个INI文件,可以用多个节. 三.读取INI文件 1.WritePrivateProfileString 该函数用于向INI文件中写入一个字符串数据. 函数原型如下: BOOL WritePrivateProfileString( LPCTSTR lpAppName, // pointer to section name LP

  • 使用Python中Tkinter模块的Treeview 组件显示ini文件操作

    前言: Tkinter模块的Treeview组件类似于Dev中的treelist控件,但前者还可以当做树控件和表格控件使用,虽然功能可能没有dev和winform控件那么强大,但是在Tkinter中算是比较复杂.用处较多的了. Treeview组件位于ttk模块,该模块自Tk8.5开始引入,如果 Python 未基于 Tk 8.5 编译,只要安装了 Tile 仍可访问本模块.Treeview支持按层次结构展示一组数据项,用excel做了个简单的示意图(如下所示),Treeview 组件左侧可以理

  • PHP中操作ini配置文件的方法

    PHP操作ini配置文件 复制代码 代码如下: <?php//写ini文件function write_ini_file($assoc_arr, $path, $has_sections=FALSE){    $content = "";    if ($has_sections)    {        foreach ($assoc_arr as $key=>$elem)        {            $content .= "[".$ke

随机推荐