C# 操作INI文件类

  • 第一种

    //补充:   
    //using System;
    //using System.Runtime.InteropServices;
    //using System.Text;
    //using System.Collections;
    //using System.Collections.Specialized; 
    //namespace wuyisky
    //{
    /**/
    /**/
    /**/
    /// 
    /// IniFiles的类
    /// 
    public class IniFiles
    {
        public string FileName;
        //INI文件名
        //声明读写INI文件的API函数
        [DllImport("kernel32")] private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);

        //类的构造函数,传递INI文件名
        public IniFiles(string AFileName)
        {
            // 判断文件是否存在
            FileInfo fileInfo = new FileInfo(AFileName);
            //Todo:搞清枚举的用法
            if ((!fileInfo.Exists))
            {
                //|| (FileAttributes.Directory in fileInfo.Attributes))
                //文件不存在,建立文件
                System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName, false, System.Text.Encoding.Default);
                try
                {
                    sw.Write("#表格配置档案");
                    sw.Close();
                } 
                catch
                {
                    throw (new ApplicationException("Ini文件不存在"));
                }
            }
            //必须是完全路径,不能是相对路径
            FileName = fileInfo.FullName;
        }
       
        //写INI文件
        public void WriteString(string Section, string Ident, string Value)
        {
            if (!WritePrivateProfileString(Section, Ident, Value, FileName))
            { 
                throw (new ApplicationException("写Ini文件出错"));
            }
        }
       
        //读取INI文件指定
        public string ReadString(string Section, string Ident, string Default)
        {
            Byte[] Buffer = new Byte[65535];
            int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);
            //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文
            string s = Encoding.GetEncoding(0).GetString(Buffer);
            s = s.Substring(0, bufLen);
            return s.Trim();
        } 
       
        //读整数
        public int ReadInteger(string Section, string Ident, int Default)
        {
            string intStr = ReadString(Section, Ident, Convert.ToString(Default));
            try
            {
                return Convert.ToInt32(intStr); 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message); return Default;
            }
        } 
       
        //写整数
        public void WriteInteger(string Section, string Ident, int Value)
        {
            WriteString(Section, Ident, Value.ToString());
        } 
       
        //读布尔
        public bool ReadBool(string Section, string Ident, bool Default)
        {
            try
            {
                return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default)));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return Default;
            }
        } 
       
        //写Bool
        public void WriteBool(string Section, string Ident, bool Value)
        {
            WriteString(Section, Ident, Convert.ToString(Value));
        } 
       
        //从Ini文件中,将指定的Section名称中的所有Ident添加到列表中
        public void ReadSection(string Section, StringCollection Idents)
        {
            Byte[] Buffer = new Byte[16384];
            //Idents.Clear(); 
            int bufLen = GetPrivateProfileString(Section, null, null, Buffer, Buffer.GetUpperBound(0), FileName);
            //对Section进行解析
            GetStringsFromBuffer(Buffer, bufLen, Idents);
        } 
       
        private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings)
        {
            Strings.Clear();
            if (bufLen != 0)
            {
                int start = 0;
                for (int i = 0; i<bufLen; i++)
                {
                    if ((Buffer[i] == 0) && ((i - start) > 0))
                    {
                        String s = Encoding.GetEncoding(0).GetString(Buffer, start, i - start);
                        Strings.Add(s);
                        start = i + 1;
                    }
                }
            }
        }
       
        //从Ini文件中,读取所有的Sections的名称
        public void ReadSections(StringCollection SectionList)
        {
            //Note:必须得用Bytes来实现,StringBuilder只能取到第一个
            //Section
            byte[] Buffer = new byte[65535];
            int bufLen = 0;
            bufLen = GetPrivateProfileString(null, null, null, Buffer, Buffer.GetUpperBound(0), FileName);
            GetStringsFromBuffer(Buffer, bufLen, SectionList);
        }
       
        //读取指定的Section的所有Value到列表中
        public void ReadSectionValues(string Section, NameValueCollection Values)
        {
            StringCollection KeyList = new StringCollection();
            ReadSection(Section, KeyList);
            Values.Clear();
            foreach (string key in KeyList)
            {
                Values.Add(key, ReadString(Section, key, "")); 
            }
        }
       
        /**/
        //
        //读取指定的Section的所有Value到列表中,
        //public void ReadSectionValues(string Section, NameValueCollection Values,char splitString)
        //{ string sectionValue;
        // string[] sectionValueSplit;
        // StringCollection KeyList = new StringCollection();
        // ReadSection(Section, KeyList);
        // Values.Clear();
        // foreach (string key in KeyList)
        // {
        // sectionValue=ReadString(Section, key, "");
        // sectionValueSplit=sectionValue.Split(splitString);
        // Values.Add(key, sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString()); 
        // }
        //}
        //清除某个Section public void EraseSection(string Section) {
        // if (!WritePrivateProfileString(Section, null, null, FileName)) {  throw (new ApplicationException("无法清除Ini文件中的Section")); } }
        //删除某个Section下的键 public void DeleteKey(string Section, string Ident) { WritePrivateProfileString(Section, Ident, null, FileName); }
        //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件 //在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile
        //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。 public void UpdateFile() { WritePrivateProfileString(null, null, null, FileName); } 
        //检查某个Section下的某个键值是否存在 public bool ValueExists(string Section, string Ident) {
        // StringCollection Idents = new StringCollection(); ReadSection(Section, Idents); return Idents.IndexOf(Ident) > -1; } 
        //确保资源的释放 ~IniFiles() { UpdateFile(); } } }
 }


  • 第二种

    /// <summary>
    ///Class2 的摘要说明
    /// </summary>
    public class Class2
    {
  //
  //TODO: 在此处添加构造函数逻辑
  //
        [DllImport("kernel32.dll")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32.dll")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); 
   
     public Class2()
     {}
        /// <summary>
        /// 写入INI文件
        /// </summary>
        /// <param name=^Section^>节点名称</param>
        /// <param name=^Key^>关键字</param>
        /// <param name=^Value^>值</param>
        /// <param name=^filepath^>INI文件路径</param>
        static public void IniWriteValue(string Section, string Key, string Value, string filepath)
        { WritePrivateProfileString(Section, Key, Value, filepath); } 
   
        /// <summary>
        /// 读取INI文件
        /// </summary>
        /// <param name=^Section^>节点名称</param>
        /// <param name=^Key^>关键字</param>
        /// <param name=^filepath^>INI文件路径</param>
        /// <returns>值</returns>
        static public string IniReadValue(string Section, string Key, string filepath)
        {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section, Key, "", temp,255, filepath);
            return temp.ToString();
        } 
    }
    //ini 文档格式路径假设为 D:/SETUP.ini  [SQL]  SVRName=192.168.1.11\SQL2005  读取实例 
    //    IniReadValue("SQL", "SVRName"," D:/SETUP.ini");  这样读取出来的值是192.168.1.11\SQL2005  写的话类似
    //    IniReadValue("SQL", "SVRName","你要写入的值"," D:/SETUP.ini");  
   


  • 第三种

/// <summary>
/// 读写INI文件的类。
/// </summary>
public class INIHelper
{
    // 读写INI文件相关。

    [DllImport("kernel32.dll", EntryPoint = "WritePrivateProfileString", CharSet = CharSet.Ansi)]
    public static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

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

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

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

    [DllImport("KERNEL32.DLL ", EntryPoint = "GetPrivateProfileSection", CharSet = CharSet.Ansi)]
    public static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string filePath);
   
    /// <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)
    {
        INIHelper.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 = INIHelper.GetPrivateProfileString(Section, Key, "", temp, 255, path);
        return temp.ToString();
    }

    /// <summary>
    /// 读取一个ini里面所有的节
    /// </summary>
    /// <param name="sections"></param>
    /// <param name="path"></param>
    /// <returns></returns>
    public static int GetAllSectionNames(out string[] sections, string path)
    {
        int MAX_BUFFER = 32767;
        IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
        int bytesReturned = INIHelper.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;
    }

    //public static int GetAllSectionNames(out string[] sections, string path)
    //{
    //    byte[] buff = new byte[1024];
    //    Win32Api.GetPrivateProfileSectionNames(buff, buff.Length, path);
    //    String s = System.Text.Encoding.Default.GetString(buff);
    //    String[] names = s.Split('\0');
    //    int count = 0;
    //    foreach (String name in names)
    //    {
    //        if (name == "")
    //            break;
    //        count++;
    //    }
    //    sections = new string[count];
    //    Array.Copy(names, sections, count);
    //    return 0;
    //}

    /// <summary>
    /// 得到某个节点下面所有的key和value组合
    /// </summary>
    /// <param name="section"></param>
    /// <param name="keys"></param>
    /// <param name="values"></param>
    /// <param name="path"></param>
    /// <returns></returns>
    public static int GetAllKeyValues(string section, out string[] keys, out string[] values, string path)
    {
        byte[] b = new byte[65535];

        INIHelper.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];
        values = 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();
                values[i] = item[1].Trim();
            }
            else if (item.Length == 1)
            {
                keys[i] = item[0].Trim();
                values[i] = "";
            }
            else if (item.Length == 0)
            {
                keys[i] = "";
                values[i] = "";
            }
        }
        return 0;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值