zoukankan      html  css  js  c++  java
  • C#读取ini文件的方法

    最近项目用到ini文件,读取ini文件,方法如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.Specialized;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace test{
        /// <summary>
        /// IniFiles的类
        /// </summary>
        public class IniFiles
        {
            public string FileName; //INI文件名
            //string path   =   System.IO.Path.Combine(Application.StartupPath,"pos.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();
            }
        }
    }


    ini文件注意点:采用此类读取ini文件的时候首行必须空一行

    [Parm]
    xxxx =2016-01-08 16:42:04
    IsOver =-1
    EndTime =2016-01-11 11:30:08

  • 相关阅读:
    1-1 课程简介 & 2-1 IDEA与Eclipse的不同 & 2-3 Intellij IDEA安装
    MyBatis入门
    贪婪法——————贪心算法
    Java排序之直接选择排序
    是时候学一波STL了。。。
    Java提高篇(三一)-----Stack
    Android 经常使用工作命令mmm,mm,m,croot,cgrep,jgrep,resgrep,godir
    【POJ 2750】 Potted Flower(线段树套dp)
    POJ 题目3321 Apple Tree(线段树)
    Android新手入门2016(14)--FragmentTabHost实现选项卡和菜单
  • 原文地址:https://www.cnblogs.com/love007/p/5123394.html
Copyright © 2011-2022 走看看