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

C# 操作INI文件

时间:2023-09-24 21:35:16浏览次数:80  
标签:文件 string C# section INI key

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;

        /// <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);
调用
        /// <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;

        /// <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); 

调用
        /// <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人夕岸

标签:文件,string,C#,section,INI,key
From: https://www.cnblogs.com/yangyongdashen-S/p/YiRenXiAn_CSharp_INI.html

相关文章

  • crash —— 如果知道结构体内部某个成员的地址,如何输出结构体内容?
    以下面的task_struct为例:crash>*task_struct-oxffff893e3846e000structtask_struct{[ffff893e3846e000]structthread_infothread_info;[ffff893e3846e010]volatilelongstate;[ffff893e3846e018]void*stack;[ffff893e3846e020]atomic_tusage;[ff......
  • etcd 集群安装
    1.环境准备下载安装包:https://github.com/etcd-io/etcd/releases/这里下载的安装包为:etcd-v3.5.9-linux-amd64.tar.gz,即我们当前安装的etcd版本为:3.5.9这里有3个节点,分别为:10.23.0.21ec110.23.0.22ec210.23.0.23ec32.安装配置首先在所有机器安装etcd如下:tar-x......
  • 为什么@Resource无法注入泛型类型而@Autowired可以
    在Spring框架中,我们通常使用@Autowired和@Resource两个注解来实现属性注入。但是当涉及到泛型类型时,使用@Resource注解就会失败,而@Autowired可以正常工作。这篇文章就来分析它们之间的区别。@Autowired可以直接注入泛型类型,例如:```java@AutowiredprivateRepository<User>......
  • Service mesh 学习02 Istio基础
    一、Istio架构概述1.Pilot提供服务发现和路由规则2.Mixer策略控制:服务调用限流3.citadel安全作用,可以保证服务间的通信安全4.Enovy代理:处理服务的流量二、自动注入sidecar-injector:会修改应用程序的描述信息,注入sidecar描述信息:创建pod的yaml文件三、流量拦截根据iptables路由规......
  • 面试官:聊聊ThreadLocal
    面试中ThreadLocal能问的,都在这了(qq.com)今天我们来盘一盘ThreadLocal,这篇力求对ThreadLocal一网打尽,彻底弄懂ThreadLocal的机制。话不多说,本文要解决的问题如下:为什么需要ThreadLocal应该如何设计ThreadLocal从源码看ThreadLocal的原理ThreadLocal内存泄露之......
  • C语言学习记录---函数4
    汉诺塔问题(递归)#include<stdio.h>//定义汉诺塔函数voidhanoi(intn,charA,charB,charC){if(n==1){printf("将盘子从%c移动到%c\n",A,C);}else{//将n-1个盘子从A移动到Bhanoi(n-1,A,C,B);//将第n个盘子从......
  • Hyperledger Fabric 2.5.4开发之证书管理指南
    前提条件¶以下关于身份、会员服务提供商(MSP)和证书颁发机构(CA)的Fabric文档资源为理解证书管理提供了上下文:身份(Identity)MSP注册和登记(RegistrationandEnrollment)注册身份登记身份关键概念¶注册(Register)用户名和密码对,存储在证书颁发机构(CA)中。此注册由CA管理员用户创建,没有过期,......
  • Llama2-Chinese项目:2.3-预训练使用QA还是Text数据集?
      Llama2-Chinese项目给出pretrain的data为QA数据格式,可能会有疑问pretrain不应该是Text数据格式吗?而在Chinese-LLaMA-Alpaca-2和open-llama2预训练使用的LoRA技术,给出pretrain的data为Text数据格式。所以推测应该pretrain时QA和Text数据格式都应该支持。然后马上就会有一个疑问......
  • Teacher Forcing
    Teacherforcing是一种序列任务中的技术。它最初提出的动机是使得RNN的训练得以并行,加快模型训练。简单来说Teacherforcing就是将数据集中的标签作为模型输入。首先,以RNN为例,介绍Teacherforcing的技术细节。下图为RNN展开的计算图。如图所示,Teacherforcing在训练时和测试......
  • IntelliJ IDEA中执行@Test单元测试时报错Class not found: "..."终极办法
    之前也出现过在编译时找不到测试类的问题,但之前的那篇博文,并不是终极办法IntelliJIDEA中执行@Test单元测试时报错Classnotfound:"..."Emptytestsuite 问题:出现类似问题,普遍时同然就报错了,原因是使用IDEA,从别人的Git上拉取代码后,别人把一些idea的配置文件也传上了,到时更新......