123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Runtime.InteropServices;
- using System.Text;
- namespace ProductionLineMonitor.Core.Utils
- {
- 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
- }
- }
|