| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 | using System;using System.Collections;using System.Collections.Generic;using System.Runtime.InteropServices;using System.Text;namespace OTSIncAReportApp{    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    }}
 |