时间:2021-05-20
使用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 }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#实现读写ini文件类。分享给大家供大家参考。具体如下:这个C#类封装了对INI配置文件进行操作所需的各种函数,包括读取键值、读取键值、删除段落
本文实例为大家分享了C#语言实现ini文件读写操作的具体代码,供大家参考,具体内容如下1、ini文件是什么?见百度百科2、C#语言实现ini文件的读写操作///
本文实例为大家分享了C#操作INI配置文件示例的具体代码,供大家参考,具体内容如下源文件地址:C#操作INI配置文件示例创建如图所示的控件:源代码:usingS
本文实例讲述了C#封装的常用文件操作类。分享给大家供大家参考。具体如下:这个C#类封装了我们经常能用到的文件操作方法,包括读写文件、获取文件扩展名、复制文件、追
通常C#使用基于XML的配置文件,不过如果有需要的话,比如要兼顾较老的系统,可能还是要用到INI文件。但C#本身并不具备读写INI文件的API,只有通过调用非托