C# 操作INI文件

C#读写INI文件

.NET程序中,可以作为配置文件使用的格式又很多,INI文件在某些场景应用较为广泛,如串口参数、一些工作站本地参数等等,INI文件主要用途为读取指定节点的配置内容,以及修改指定节点。一下文章主要描述在程序对INI文件的操作。


INI文件介绍

INI文件

  • ini文件本质上就是一个扩展名为ini的文本文档,也可以当成记事本来操作。
  • 与文本文档的区别在于,ini文件有自己的格式。

INI文件结构

  • INI文件由段落(section)、键(key)、值(value)组成
  • section为段落名称,也可以理解为一个分组的标题。中括号表示。例如:[IPLIST]
  • 键和值以key=nalue的形式表示,每个段落可以有多个键值对;

INI文件格式示例

[section_A]

key1=value1

key2=value2

key3=value3

[section_B]

key1=value1

key2=value2

key3=value3

... ... ... ...

[IPLIST]
k1=127.0.0.1
k2=127.0.0.2
k3=127.0.0.3
;IP列表

每行开头添加 为注释

在C#中操作INI文件

在C#命名空间中没有专门操作INI文件的类,但在kernel32.dll中,有Win32的API函数对文件的操作

  • WritePrivateProfileString():写操作函数
  • GetPrivateProfileString():读操作函数

写操作函数说明

函数声明

DllImport需引入命名空间 using System.Runtime.InteropServices;

C# 复制代码
        /// <summary>
        /// 修改INI文件内容
        /// </summary>
        /// <param name="lpApplicationName">节点名称(段落名称)section</param>
        /// <param name="lpKeyName">要设置的项名,Key</param>
        /// <param name="lpString">要写入的新字符串Value</param>
        /// <param name="lpFileName">INI文件晚挣路径</param>
        /// <returns>0表示失败,非零表示成功</returns>
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString
            (string lpApplicationName, 
            string lpKeyName, 
            string lpString, 
            string lpFileName);
调用
C# 复制代码
        /// <summary>
        /// 保存ini
        /// </summary>
        /// <param name="section">节点/段落名称</param>
        /// <param name="key">项/Key名称</param>
        /// <param name="value">值</param>
        /// <param name="filePath">ini文件路径</param>
        public static void WriteIniKeys(string section, string key, string value, string filePath)
        {
            WritePrivateProfileString(section, key, value, filePath);
        }

        /*
         * 若value为null则会删除配置文件中对应的key
         * 若key value为null则会删除对应的section
        */

读操作函数说明

函数声明

DllImport需引入命名空间 using System.Runtime.InteropServices;

C# 复制代码
        /// <summary>
        /// 获取INI中指定字符串
        /// </summary>
        /// <param name="lpAppName">节点名称(段落名称)section</param>
        /// <param name="lpKeyName">项名,Key</param>
        /// <param name="lpDefault">未找到指定项时返回的默认值</param>
        /// <param name="lpReturnedString">指定一个字符串缓冲区,长度至少为nSize</param>
        /// <param name="nSize">指定装载到lpReturnedString缓冲区的最大字符数量</param>
        /// <param name="lpFileName">INI文件路径</param>
        /// <returns>复制到lpReturnedString中的字节数量</returns>
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString
            (string lpAppName,
            string lpKeyName,
            string lpDefault,
            StringBuilder lpReturnedString,
            int nSize,
            string lpFileName); 
调用
C# 复制代码
        /// <summary>
        /// 根据section,key取值,并设置默认值
        /// </summary>
        /// <param name="section">节点/段落名称</param>
        /// <param name="key">项/Key名称</param>
        /// <param name="def">默认值</param>
        /// <param name="filePath">文件路径</param>
        /// <returns>返回指定内容,若不存在则返回默认值def</returns>
        private static string ReadIniKeys(string section, string key, string def, string filePath)
        {
            StringBuilder temp = new StringBuilder(1024);
            GetPrivateProfileString(section, key, def, temp, 1024, filePath);
            return temp.ToString();
        }

以上为C#读写INI的实现方法,针对此方法编写了帮助类,项目已上传至Gitee

地址 :https://gitee.com/yang-yong-666/csharp

类文件:YYIniHelper.INIHelper.cs


个人交流QQ:1695690324
原创不易,转载请注明出处
博客园:https://www.cnblogs.com/yangyongdashen-S/
CSDN:https://blog.csdn.net/weixin_44312699?spm=1010.2135.3001.5343
Gitee:https://gitee.com/yang-yong-666
公众号:yi人夕岸

相关推荐
坐井观老天4 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
pchmi6 小时前
C# OpenCV机器视觉:模板匹配
opencv·c#·机器视觉
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭8 小时前
C#都可以找哪些工作?
开发语言·c#
1900438 小时前
.NET重点
.net
m0_663234018 小时前
在 .NET 5.0 运行 .NET 8.0 教程:使用 ASP.NET Core 创建 Web API
前端·asp.net·.net
boligongzhu9 小时前
Dalsa线阵CCD相机使用开发手册
c#
向宇it1 天前
【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)
java·开发语言·unity·c#·游戏引擎·里氏替换原则
sukalot1 天前
windows C#-命名实参和可选实参(下)
windows·c#
小码编匠1 天前
.NET 下 RabbitMQ 队列、死信队列、延时队列及小应用
后端·c#·.net