首页 > 编程语言 >C# ini文件操作类

C# ini文件操作类

时间:2023-10-25 16:11:42浏览次数:25  
标签:key 文件 string C# Section int ini Key public

 /// <summary>
    /// INI文件读写类。  
    /// </summary>
    public class INIFile
    {
        public string path;

        public INIFile(string INIPath)
        {
            path = INIPath;
        }

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);


        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);

        [DllImport("kernel32.dll")]
        private static extern int GetPrivateProfileInt(string lpAppName, 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);

        /// <summary>
        /// 写INI文件
        /// </summary>
        /// <param name="Section"></param>
        /// <param name="Key"></param>
        /// <param name="Value"></param>
        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, this.path);
        }

        /// <summary>
        /// 读取INI文件
        /// </summary>
        /// <param name="Section"></param>
        /// <param name="Key"></param>
        /// <returns></returns>
        public string IniReadValue(string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(1024);
            int i = GetPrivateProfileString(Section, Key, "", temp, 1024, this.path);
            return temp.ToString();
        }

        public string IniReadValue(string Section, string Key, int size)
        {
            StringBuilder temp = new StringBuilder(size);
            int i = GetPrivateProfileString(Section, Key, "", temp, size, this.path);
            return temp.ToString();
        }

        public int ReadInt(string Section, string Key)
        {
            int def = 0;
            return GetPrivateProfileInt(Section, Key, def, this.path);
        }

        public byte[] IniReadValues(string section, string key)
        {
            byte[] temp = new byte[1024];
            int i = GetPrivateProfileString(section, key, "", temp, 1024, this.path);
            return temp;

        }


        /// <summary>
        /// 删除ini文件下所有段落
        /// </summary>
        public void ClearAllSection()
        {
            IniWriteValue(null, null, null);
        }
        /// <summary>
        /// 删除ini文件下personal段落下的所有键
        /// </summary>
        /// <param name="Section"></param>
        public void ClearSection(string Section)
        {
            IniWriteValue(Section, null, null);
        }

        /// <summary>
        /// 返回指定配置文件下的节名称列表
        /// </summary>
        /// <returns></returns>
        public List<string> GetAllSectionNames()
        {
            List<string> sectionList = new List<string>();
            int MAX_BUFFER = 32767;
            IntPtr pReturnedString = Marshal.AllocCoTaskMem(MAX_BUFFER);
            int bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, this.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 Hashtable GetAllKeyValues(string section)
        {
            Hashtable ht = new Hashtable();

            byte[] b = new byte[65535];//配置节下的所有信息
            GetPrivateProfileSection(section, b, b.Length, this.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);
            }

            for (int i = 0; i < result.Count; i++)
            {
                string[] item = result[i].Split(new char[] { '=' });//Key=Value格式的配置信息
                string key = item[0].Trim();

                //Value字符串中含有=的处理,
                //一、Value加"",先对""处理
                //二、Key后续的都为Value
                if (item.Length > 2)
                {
                    ht.Add(key, result[i].Substring(key.Length + 1));
                }
                if (item.Length == 2)//Key=Value
                {
                    ht.Add(key, item[1].Trim());
                }
                else if (item.Length == 1)//Key=
                {
                    ht.Add(key, "");
                }
                else if (item.Length == 0)
                {
                    //ht.Add("", "");
                }
            }
            return ht;
        }

    }

 

标签:key,文件,string,C#,Section,int,ini,Key,public
From: https://www.cnblogs.com/handsomeziff/p/17787471.html

相关文章

  • Vue中 使用 Scss 实现配置、切换主题
    1.样式文件目录介绍本项目中的公共样式文件均位于src/assets/css目录下,其中index.scss是总的样式文件的汇总入口,common.scss是供全局使用的一些基本样式(常量),_theme.scss、_handle.scss两个文件是进行主题颜色配置的文件。如下图,将index.scss在main.js文件中引入即可全......
  • 将nginx的access.log访问日志发送到rsyslog服务器并写入数据库
    nginx.conf(将原日志路径改为rsyslog服务器地址)access_logsyslog:server=10.10.14.64:514,facility=local6main;如果需要入库需要安装相应数据库的依赖包;mysql依赖:yuminstall-y rsyslog-mysql   pgsql依赖:yuminstall-y rsyslog-pgsql  还有很多其他依赖可以用......
  • 个人制作 | 360断网急救箱新版-2.0版单文件绿色版 分享(解决99%的电脑无法上网问题)
    一、电脑常见无法上网原因 1、硬件问题如,网线松动,网线接口物理损坏等2、网卡驱动问题如,设置的网卡驱动非官方驱动,网卡驱动版本不匹配等3、网络配置问题如出现qq可以聊天但是浏览器无法上网或者qq无法聊天但是浏览器可以上网,无线网络符号有一个感叹号,无线无法连接等都与网络......
  • Hive学习笔记:nvl和coalesce函数的区别
    nvl函数和coalesce函数都是用来处理空值的函数,但略有不同。注意:非NULL值为NULL,如果是'','','null','NULL'等视为字符串,返回参数本身。一、nvl函数nvl只能处理2个参数,如果第1个不是null,则返回第1个参数,否则返回第2个参数。selectnvl(1,2);--1selectnvl(1,n......
  • C++中vector容器详解
    参考链接:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html一、什么是vector?向量(Vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。二......
  • MQTT:掉线重连 (Reconnect)
    cleansession对重连的影响在使用MQTT同步:#include"MQTTClient.h"时,若client与broker断开了连接,重连逻辑如何实现呢?其中cleansession对重连逻辑实现有什么影响呢?分别对cleansession的两种情况进行测试和验证。......
  • TCP和HTTP协议的路由跟踪
    方式1:yuminstall-ytraceroutetraceroute-T或者tcptraceroute,tcptraceroute是 traceroute-T的别名-T                    #使用TCPSYN包进行探测,等同于tcptraceroute,默认端口是80-4                    #强制使用ipv4地址-......
  • Falcon:我们是靠洗数据洗败 LLaMA 的!
    原文链接:https://blog.csdn.net/qq_27590277/article/details/131298092思想:从数据入手,想炼丹,先把好原材料的关。这个模型仅使用“互联网语料”(不需要额外的数据源),就可以训练一个不错的大模型。问题点:数据、wikipedia、论文集这些数据集质量高,但是不易扩展,数量级起不来。假......
  • 关于32位MCU GPIO八种工作模式配置
    参考链接:https://mp.weixin.qq.com/s/vgYzCcxmsfn7BGWERHfITQ通常,32位MCU的GPIO有多种配置方式,如STM32、CH32MCU的GPIO引脚都有八种配置方式,总体可分为两类:输入和输出。其中:输入可分为:浮空输入上拉输入下拉输入模拟输入输出可分为开漏输出推挽输出复用开漏输出复用......
  • CF1572F Stations 题解-Segment Tree Beats
    20231025CF1572FStations题解-SegmentTreeBeats吉司机线段树好题!!!CF3400。传送门Statement有\(n\)个广播站,第\(i\)个广播站高度为\(h_i\),范围为\(w_i\)。初始\(h_i=0,w_i=i\)。广播站\(i\)能向广播站\(j\)传递消息,当且仅当\(i\lej\lew_i\),且\(h_i>\max\lim......