zoukankan      html  css  js  c++  java
  • IniHelper——INI操作辅助类

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

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

      1 using System;
      2 using System.Collections;
      3 using System.Collections.Generic;
      4 using System.Runtime.InteropServices;
      5 using System.Text;
      6 
      7 namespace Eyuan.Common
      8 {
      9     public static class INIHelper
     10     {
     11 
     12         #region 读写INI文件相关
     13         [DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString", CharSet = CharSet.Ansi)]
     14         private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
     15 
     16         [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString", CharSet = CharSet.Ansi)]
     17         private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
     18 
     19         [DllImport("kernel32")]
     20         private static extern int GetPrivateProfileInt(string lpApplicationName, string lpKeyName, int nDefault, string lpFileName);
     21 
     22 
     23         [DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileSectionNames", CharSet = CharSet.Ansi)]
     24         private static extern int GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, int nSize, string filePath);
     25 
     26         [DllImport("KERNEL32.DLL ", EntryPoint = "GetPrivateProfileSection", CharSet = CharSet.Ansi)]
     27         private static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string filePath);
     28         #endregion
     29 
     30         #region 读写操作(字符串)
     31         /// <summary>
     32         /// 向INI写入数据
     33         /// </summary>
     34         /// <PARAM name="Section">节点名</PARAM>
     35         /// <PARAM name="Key">键名</PARAM>
     36         /// <PARAM name="Value">值(字符串)</PARAM>
     37         public static void Write(string Section, string Key, string Value, string path)
     38         {
     39             WritePrivateProfileString(Section, Key, Value, path);
     40         }
     41         /// <summary>
     42         /// 读取INI数据
     43         /// </summary>
     44         /// <PARAM name="Section">节点名</PARAM>
     45         /// <PARAM name="Key">键名</PARAM>
     46         /// <PARAM name="Path">值名</PARAM>
     47         /// <returns>值(字符串)</returns>
     48         public static string Read(string Section, string Key, string path)
     49         {
     50             StringBuilder temp = new StringBuilder(255);
     51             int i = GetPrivateProfileString(Section, Key, "", temp, 255, path);
     52             return temp.ToString();
     53         }
     54         #endregion
     55 
     56         #region 配置节信息
     57         /// <summary>
     58         /// 读取一个ini里面所有的节
     59         /// </summary>
     60         /// <param name="sections"></param>
     61         /// <param name="path"></param>
     62         /// <returns>-1:没有节信息,0:正常</returns>
     63         public static int GetAllSectionNames(out string[] sections, string path)
     64         {
     65             int MAX_BUFFER = 32767;
     66             IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
     67             int bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, path);
     68             if (bytesReturned == 0)
     69             {
     70                 sections = null;
     71                 return -1;
     72             }
     73             string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
     74             Marshal.FreeCoTaskMem(pReturnedString);
     75             //use of Substring below removes terminating null for split
     76             sections = local.Substring(0, local.Length - 1).Split('');
     77             return 0;
     78         }
     79         /// <summary>
     80         /// 返回指定配置文件下的节名称列表
     81         /// </summary>
     82         /// <param name="path"></param>
     83         /// <returns></returns>
     84         public static List<string> GetAllSectionNames(string path)
     85         {
     86             List<string> sectionList = new List<string>();
     87             int MAX_BUFFER = 32767;
     88             IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
     89             int bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, path);
     90             if (bytesReturned != 0)
     91             {
     92                 string local = Marshal.PtrToStringAnsi(pReturnedString, (int)bytesReturned).ToString();
     93                 Marshal.FreeCoTaskMem(pReturnedString);
     94                 sectionList.AddRange(local.Substring(0, local.Length - 1).Split(''));
     95             }
     96             return sectionList;
     97         }
     98 
     99         /// <summary>
    100         /// 得到某个节点下面所有的key和value组合
    101         /// </summary>
    102         /// <param name="section">指定的节名称</param>
    103         /// <param name="keys">Key数组</param>
    104         /// <param name="values">Value数组</param>
    105         /// <param name="path">INI文件路径</param>
    106         /// <returns></returns>
    107         public static int GetAllKeyValues(string section, out string[] keys, out string[] values, string path)
    108         {
    109             byte[] b = new byte[65535];//配置节下的所有信息
    110             GetPrivateProfileSection(section, b, b.Length, path);
    111             string s = System.Text.Encoding.Default.GetString(b);//配置信息
    112             string[] tmp = s.Split((char)0);//KeyValue信息
    113             List<string> result = new List<string>();
    114             foreach (string r in tmp)
    115             {
    116                 if (r != string.Empty)
    117                     result.Add(r);
    118             }
    119             keys = new string[result.Count];
    120             values = new string[result.Count];
    121             for (int i = 0; i < result.Count; i++)
    122             {
    123                 string[] item = result[i].Split(new char[] { '=' });//Key=Value格式的配置信息
    124                 //Value字符串中含有=的处理,
    125                 //一、Value加"",先对""处理
    126                 //二、Key后续的都为Value
    127                 if (item.Length > 2)
    128                 {
    129                     keys[i] = item[0].Trim();
    130                     values[i] = result[i].Substring(keys[i].Length + 1);
    131                 }
    132                 if (item.Length == 2)//Key=Value
    133                 {
    134                     keys[i] = item[0].Trim();
    135                     values[i] = item[1].Trim();
    136                 }
    137                 else if (item.Length == 1)//Key=
    138                 {
    139                     keys[i] = item[0].Trim();
    140                     values[i] = "";
    141                 }
    142                 else if (item.Length == 0)
    143                 {
    144                     keys[i] = "";
    145                     values[i] = "";
    146                 }
    147             }
    148             return 0;
    149         }
    150         /// <summary>
    151         /// 得到某个节点下面所有的key
    152         /// </summary>
    153         /// <param name="section">指定的节名称</param>
    154         /// <param name="keys">Key数组</param>
    155         /// <param name="path">INI文件路径</param>
    156         /// <returns></returns>
    157         public static int GetAllKeys(string section, out string[] keys, string path)
    158         {
    159             byte[] b = new byte[65535];
    160 
    161             GetPrivateProfileSection(section, b, b.Length, path);
    162             string s = System.Text.Encoding.Default.GetString(b);
    163             string[] tmp = s.Split((char)0);
    164             ArrayList result = new ArrayList();
    165             foreach (string r in tmp)
    166             {
    167                 if (r != string.Empty)
    168                     result.Add(r);
    169             }
    170             keys = new string[result.Count];
    171             for (int i = 0; i < result.Count; i++)
    172             {
    173                 string[] item = result[i].ToString().Split(new char[] { '=' });
    174                 if (item.Length == 2)
    175                 {
    176                     keys[i] = item[0].Trim();
    177                 }
    178                 else if (item.Length == 1)
    179                 {
    180                     keys[i] = item[0].Trim();
    181                 }
    182                 else if (item.Length == 0)
    183                 {
    184                     keys[i] = "";
    185                 }
    186             }
    187             return 0;
    188         }
    189         /// <summary>
    190         /// 获取指定节下的Key列表
    191         /// </summary>
    192         /// <param name="section">指定的节名称</param>
    193         /// <param name="path">配置文件名称</param>
    194         /// <returns>Key列表</returns>
    195         public static List<string> GetAllKeys(string section, string path)
    196         {
    197             List<string> keyList = new List<string>();
    198             byte[] b = new byte[65535];
    199             GetPrivateProfileSection(section, b, b.Length, path);
    200             string s = System.Text.Encoding.Default.GetString(b);
    201             string[] tmp = s.Split((char)0);
    202             List<string> result = new List<string>();
    203             foreach (string r in tmp)
    204             {
    205                 if (r != string.Empty)
    206                     result.Add(r);
    207             }
    208             for (int i = 0; i < result.Count; i++)
    209             {
    210                 string[] item = result[i].Split(new char[] { '=' });
    211                 if (item.Length == 2 || item.Length == 1)
    212                 {
    213                     keyList.Add(item[0].Trim());
    214                 }
    215                 else if (item.Length == 0)
    216                 {
    217                     keyList.Add(string.Empty);
    218                 }
    219             }
    220             return keyList;
    221         }
    222         /// <summary>
    223         /// 获取值
    224         /// </summary>
    225         /// <param name="section"></param>
    226         /// <param name="path"></param>
    227         /// <returns></returns>
    228         public static List<string> GetAllValues(string section, string path)
    229         {
    230             List<string> keyList = new List<string>();
    231             byte[] b = new byte[65535];
    232             GetPrivateProfileSection(section, b, b.Length, path);
    233             string s = System.Text.Encoding.Default.GetString(b);
    234             string[] tmp = s.Split((char)0);
    235             List<string> result = new List<string>();
    236             foreach (string r in tmp)
    237             {
    238                 if (r != string.Empty)
    239                     result.Add(r);
    240             }
    241             for (int i = 0; i < result.Count; i++)
    242             {
    243                 string[] item = result[i].Split(new char[] { '=' });
    244                 if (item.Length == 2 || item.Length == 1)
    245                 {
    246                     keyList.Add(item[1].Trim());
    247                 }
    248                 else if (item.Length == 0)
    249                 {
    250                     keyList.Add(string.Empty);
    251                 }
    252             }
    253             return keyList;
    254         }
    255        
    256         #endregion
    257 
    258         #region 通过值查找键(一个节中的键唯一,可能存在多个键值相同,因此反查的结果可能为多个)
    259 
    260         /// <summary>
    261         /// 第一个键
    262         /// </summary>
    263         /// <param name="section"></param>
    264         /// <param name="path"></param>
    265         /// <param name="value"></param>
    266         /// <returns></returns>
    267         public static string GetFirstKeyByValue(string section, string path, string value)
    268         {
    269             foreach (string key in GetAllKeys(section, path))
    270             {
    271                 if (ReadString(section, key, "", path) == value)
    272                 {
    273                     return key;
    274                 }
    275             }
    276             return string.Empty;
    277         }
    278         /// <summary>
    279         /// 所有键
    280         /// </summary>
    281         /// <param name="section"></param>
    282         /// <param name="path"></param>
    283         /// <param name="value"></param>
    284         /// <returns></returns>
    285         public static List<string> GetKeysByValue(string section, string path, string value)
    286         {
    287             List<string > keys = new List<string>();
    288             foreach (string key in GetAllKeys(section, path))
    289             {
    290                 if (ReadString(section, key, "", path) == value)
    291                 {
    292                     keys.Add(key);
    293                 }
    294             }
    295             return keys;
    296         }
    297         #endregion
    298 
    299 
    300         #region 具体类型的读写
    301 
    302         #region string
    303         /// <summary>
    304         /// 
    305         /// </summary>
    306         /// <param name="sectionName"></param>
    307         /// <param name="keyName"></param>
    308         /// <param name="defaultValue" />
    309         /// <param name="path"></param>
    310         /// <returns></returns>
    311         public static string ReadString(string sectionName, string keyName, string defaultValue, string path)
    312         {
    313             const int MAXSIZE = 255;
    314             StringBuilder temp = new StringBuilder(MAXSIZE);
    315             GetPrivateProfileString(sectionName, keyName, defaultValue, temp, 255, path);
    316             return temp.ToString();
    317         }
    318 
    319         /// <summary>
    320         /// 
    321         /// </summary>
    322         /// <param name="sectionName"></param>
    323         /// <param name="keyName"></param>
    324         /// <param name="value"></param>
    325         /// <param name="path"></param>
    326         public static void WriteString(string sectionName, string keyName, string value, string path)
    327         {
    328             WritePrivateProfileString(sectionName, keyName, value, path);
    329         }
    330         #endregion
    331 
    332         #region Int
    333         /// <summary>
    334         /// 
    335         /// </summary>
    336         /// <param name="sectionName"></param>
    337         /// <param name="keyName"></param>
    338         /// <param name="defaultValue"></param>
    339         /// <param name="path"></param>
    340         /// <returns></returns>
    341         public static int ReadInteger(string sectionName, string keyName, int defaultValue, string path)
    342         {
    343 
    344             return GetPrivateProfileInt(sectionName, keyName, defaultValue, path);
    345 
    346         }
    347         /// <summary>
    348         /// 
    349         /// </summary>
    350         /// <param name="sectionName"></param>
    351         /// <param name="keyName"></param>
    352         /// <param name="value"></param>
    353         /// <param name="path"></param>
    354         public static void WriteInteger(string sectionName, string keyName, int value, string path)
    355         {
    356 
    357             WritePrivateProfileString(sectionName, keyName, value.ToString(), path);
    358 
    359         }
    360         #endregion
    361 
    362         #region bool
    363         /// <summary>
    364         /// 读取布尔值
    365         /// </summary>
    366         /// <param name="sectionName"></param>
    367         /// <param name="keyName"></param>
    368         /// <param name="defaultValue"></param>
    369         /// <param name="path"></param>
    370         /// <returns></returns>
    371         public static bool ReadBoolean(string sectionName, string keyName, bool defaultValue, string path)
    372         {
    373 
    374             int temp = defaultValue ? 1 : 0;
    375 
    376             int result = GetPrivateProfileInt(sectionName, keyName, temp, path);
    377 
    378             return (result == 0 ? false : true);
    379 
    380         }
    381         /// <summary>
    382         /// 写入布尔值
    383         /// </summary>
    384         /// <param name="sectionName"></param>
    385         /// <param name="keyName"></param>
    386         /// <param name="value"></param>
    387         /// <param name="path"></param>
    388         public static void WriteBoolean(string sectionName, string keyName, bool value, string path)
    389         {
    390             string temp = value ? "1 " : "0 ";
    391             WritePrivateProfileString(sectionName, keyName, temp, path);
    392         }
    393         #endregion
    394 
    395         #endregion
    396 
    397         #region 删除操作
    398         /// <summary>
    399         /// 删除指定项
    400         /// </summary>
    401         /// <param name="sectionName"></param>
    402         /// <param name="keyName"></param>
    403         /// <param name="path"></param>
    404         public static void DeleteKey(string sectionName, string keyName, string path)
    405         {
    406             WritePrivateProfileString(sectionName, keyName, null, path);
    407         }
    408 
    409         /// <summary>
    410         /// 删除指定节下的所有项
    411         /// </summary>
    412         /// <param name="sectionName"></param>
    413         /// <param name="path"></param>
    414         public static void EraseSection(string sectionName, string path)
    415         {
    416             WritePrivateProfileString(sectionName, null, null, path);
    417         }
    418         #endregion
    419 
    420         #region 判断节、键是否存在
    421         /// <summary>
    422         /// 指定节知否存在
    423         /// </summary>
    424         /// <param name="section"></param>
    425         /// <param name="fileName"></param>
    426         /// <returns></returns>
    427         public static bool ExistSection(string section, string fileName)
    428         {
    429             string[] sections = null;
    430             GetAllSectionNames(out sections, fileName);
    431             if (sections != null)
    432             {
    433                 foreach (var s in sections)
    434                 {
    435                     if (s == section)
    436                     {
    437                         return true;
    438                     }
    439                 }
    440             }
    441             return false;
    442         }
    443         /// <summary>
    444         /// 指定节下的键是否存在
    445         /// </summary>
    446         /// <param name="section"></param>
    447         /// <param name="key"></param>
    448         /// <param name="fileName"></param>
    449         /// <returns></returns>
    450         public static bool ExistKey(string section, string key, string fileName)
    451         {
    452             string[] keys = null;
    453             GetAllKeys(section, out keys, fileName);
    454             if (keys != null)
    455             {
    456                 foreach (var s in keys)
    457                 {
    458                     if (s == key)
    459                     {
    460                         return true;
    461                     }
    462                 }
    463             }
    464             return false;
    465         }
    466         #endregion
    467 
    468         #region 同一Section下添加多个KeyValue
    469         /// <summary>
    470         /// 
    471         /// </summary>
    472         /// <param name="section"></param>
    473         /// <param name="keyList"></param>
    474         /// <param name="valueList"></param>
    475         /// <param name="path"></param>
    476         /// <returns></returns>
    477         public static bool AddSectionWithKeyValues(string section, List<string> keyList, List<string> valueList, string path)
    478         {
    479             bool bRst = true;
    480             //判断Section是否已经存在,如果存在,返回false
    481             //已经存在,则更新
    482             //if (GetAllSectionNames(path).Contains(section))
    483             //{
    484             //    return false;
    485             //}
    486             //判断keyList中是否有相同的Key,如果有,返回false
    487 
    488             //添加配置信息
    489             for (int i = 0; i < keyList.Count; i++)
    490             {
    491                 WriteString(section, keyList[i], valueList[i], path);
    492             }
    493             return bRst;
    494         }
    495         #endregion
    496     }
    497 }
  • 相关阅读:
    移动应用跨平台之旅
    ReactNative之坑爹的在线安装
    关于拆箱装箱引发的类型转换报错
    Unity HDR (高动态范围 )
    Instruments如何看Mono内存分配
    Unity编辑器崩溃大全
    Unity3D获取手机存储空间
    关于构建AssetBundle哈希冲突的问题
    关于UnityWebRequest的超时讨论
    Wwise音频插件介绍
  • 原文地址:https://www.cnblogs.com/mahongbiao/p/3751153.html
Copyright © 2011-2022 走看看