常用配置文件 .ini、.config、 json、xml

news2024/9/28 5:34:39

ini

Initialization

INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键值对(key-val)构成,常用于微软Windows操作系统中。
这种配置文件的文件扩展名多为INI

》》INI文件不支持数据类型,所有的键值对都是字符串类型。

这意味着在读取INI文件时,需要将字符串转换成对应的数据类型,例如整数、浮点数、布尔值等
在这里插入图片描述

[Database]
Server=127.0.0.1
Port=3306
Username=root
Password=xxx
Database=mydb

[Logging]
Level=INFO
File=/xxx.log

C#中有很多库可以用来读写Ini文件。以下是一些常用的C# ini库:

ini-parser:ini-parser是一个流行的开源库,可以轻松地读取、写入和修改Ini文件。它支持多个Ini文件的读取和写入,并提供了强大的查询功能。

Nini:Nini是另一个流行的开源Ini库,它提供了一个简单的API来读取和写入Ini文件。它支持多个Ini文件的读取和写入,以及多种Ini文件格式。

SimpleIni:SimpleIni是一个轻量级的Ini库,可以快速读取和写入Ini文件。它支持多个Ini文件的读取和写入,并提供了一些简单的查询功能。

在这里插入图片描述

using IniParser;
using IniParser.Model;

// 创建一个 IniData 对象来表示 INI 文件的内容
FileIniDataParser parser = new FileIniDataParser();

//========读取===============
IniData data = parser.ReadFile("xxx/file.ini");
// 访问 INI 文件中的配置信息
string value = data["SectionName"]["KeyName"];
Console.WriteLine(value);


//========写入===============
// 创建一个新的 IniData 对象,并设置配置信息
IniData newData = new IniData();
newData.Sections.AddSection("SectionName");
newData["SectionName"].AddKey("KeyName", "Value");

// 将 IniData 对象写入 INI 文件
parser.WriteFile("xxx/file.ini", newData);



//==============更新================
// 读取现有的 INI 文件
IniData data = parser.ReadFile("xxx/file.ini");

// 更新配置信息
data["SectionName"]["KeyName"] = "NewValue";

// 将更新后的配置写回文件
parser.WriteFile("xxx/file.ini", data);



///如删除配置项、删除部分、处理注释等也支持的
自己封装方法读取
using System.IO;
using System.Collections.Generic;

public static Dictionary<string, Dictionary<string, string>> ParseIniFile(string filePath)
{
    Dictionary<string, Dictionary<string, string>> iniData = new Dictionary<string, Dictionary<string, string>>();

    using (StreamReader reader = new StreamReader(filePath))
    {
        string section = "";
        Dictionary<string, string> sectionData = new Dictionary<string, string>();

        while (!reader.EndOfStream)
        {
            string line = reader.ReadLine().Trim();

            if (line.StartsWith("[") && line.EndsWith("]"))
            {
                // 开始一个新的节
                section = line.Substring(1, line.Length - 2);
                sectionData = new Dictionary<string, string>();
                iniData[section] = sectionData;
            }
            else if (line.Contains("="))
            {
                // 解析键值对
                string[] parts = line.Split('=');
                string key = parts[0].Trim();
                string value = parts[1].Trim();
                sectionData[key] = value;
            }
        }
    }

    return iniData;
}


Dictionary<string, Dictionary<string, string>> iniData = ParseIniFile("xxx.ini");

foreach (KeyValuePair<string, Dictionary<string, string>> section in iniData)
{
    Console.WriteLine("[{0}]", section.Key);

    foreach (KeyValuePair<string, string> kvp in section.Value)
    {
        Console.WriteLine("{0}={1}", kvp.Key, kvp.Value);
    }

    Console.WriteLine();
}


用window系统自带读取INI文件中的数据

C#命名空间中没有直接读写INI的类,但在"kernel32.dll"文件中有Win32的API函数–
WritePrivateProfileString()和GetPrivateProfileString(),可操作ini文件。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace xxxx
{
    public class ReadWriteINI
    {
        #region API函数声明

        /// <summary>
        /// 写入ini文件
        /// </summary>
        /// <param name="section">节点名称</param>
        /// <param name="key">键</param>
        /// <param name="val">值</param>
        /// <param name="filePath">ini路径</param>
        /// <returns>0失败/其他成功</returns>
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="section">节点名称,[]内的段落名</param>
        /// <param name="key">键</param>
        /// <param name="def">值(未读取到数据时设置的默认返回值)</param>
        /// 对应API函数的def参数,它的值由用户指定,是当在配置文件中没有找到具体的Value时,就用def的值来代替。可以为空
        /// <param name="retVal">读取到的结果值</param>
        /// <param name="size">读取缓冲区大小</param>
        /// <param name="filePath">ini配置文件的路径加ini文件名</param>
        /// <returns>读取到的字节数量</returns>
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        #endregion

        /// <summary>
        /// 写INI,添加新节点、键值,及编辑修改键对应的值
        /// </summary>
        /// <param name="in_filename">ini配置文件的路径加ini文件名</param>
        /// <param name="Section">节点名称,[]内的段落名</param>
        /// <param name="Key">键</param>
        /// <param name="Value">值</param>
        public static bool IniFile_SetVal(string in_filename, string Section, string Key, string Value)
        {
            if (File.Exists(in_filename))
            {
                // 调用winapi函数将Key=Value写入Section节点下
                long len = WritePrivateProfileString(Section, Key, Value, in_filename);
                if (len == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                return true;
            }
        }
        /// <summary>
        /// 读ini
        /// </summary>
        /// <param name="in_filename">ini配置文件的路径加ini文件名</param>
        /// <param name="Section">节点名称,[]内的段落名</param>
        /// <param name="Key">键</param>
        /// <returns></returns>
        public static string IniFile_GetVal(string in_filename, string Section, string Key)
        {
            if (File.Exists(in_filename))
            {
                // 声明接收的数据
                StringBuilder builder = new StringBuilder(1024);
                // 调用winapi函数读取Section节点下Key的值
                int len = GetPrivateProfileString(Section, Key, "", builder, 1024, in_filename);
                if (len == 0)
                    return "1";
                else
                    return (builder.ToString());
            }
            else
                return string.Empty;
        }
    }
}

        /// <summary>
        /// 读取ini文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            string pathName = Application.StartupPath + "\\config\\xxx.ini";
            string resStarter = ReadWriteINI.IniFile_GetVal(pathName, "section名", "key");
            string[] resInitLine = resStarter.Split(',');
            for (int ii = 0; ii < resInitLine.Length; ii++)
            {
                richTextBox2.AppendText(resInitLine[ii] + "\n");
            }
        }
        /// <summary>
        /// 写入ini文件,新建或编辑
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            string pathName = Application.StartupPath + "\\xxx.ini";
            ReadWriteINI.IniFile_SetVal(pathName, "section名", "key名", "值");
            
            string[] resInitLine = richTextBox2.Lines;
            string tempWrite = string.Join(",", resInitLine);
            tempWrite=tempWrite.Remove(tempWrite.Length-1);
            ReadWriteINI.IniFile_SetVal(pathName, "section名", "key名", tempWrite);
        }

INI、

》》INI
在这里插入图片描述
》》xml
在这里插入图片描述
》》》json
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[SQLSERVER][SQL]数据库备份任务异常

SQL备份异常出现如下错误&#xff1a; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 错误如下:“无法打开备份设备 E:\\sqldatabackup19\\Report_ba…

nose2,一个无敌的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - nose2。 Github地址&#xff1a;https://github.com/nose-devs/nose2 在软件开发过程中&#xff0c;自动化测试是保证代码质量的重要环节。Python 提供…

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…

非线性磁链观测器

前面已经介绍了龙伯格观测器、滑膜观测器&#xff1a;龙伯格观测器&#xff08;又称状态观测器&#xff09;、滑膜观测器-CSDN博客 滑膜观测器和龙伯格观测器都是没法实现电机的超低速运转、0速启动、超高速的正反方向的运行。龙伯格观测器是可以实现这些功能&#xff0c;但是…

Resolving Maven dependencies

Maven是一种项目管理和构建工具&#xff0c;通常用于Java项目。这个过程包括下载项目所需的所有外部库和插件&#xff0c;并将它们添加到项目的构建路径中。具体来说&#xff0c;它正在处理名为“AAS_byBasyx”的项目或模块的依赖项。这种任务通常在你打开一个新的Maven项目或更…

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录&#xff1a; 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…

​JavaWeb入门——Servlet(二)

目录 HttpServletRequest 简介 常见API HttpServletResponse 简介 常见API 请求转发和响应重定向 概述 请求转发 响应重定向 cookie&session 会话 会话跟踪方案&#xff1a; 会话跟踪方案对比&#xff1a; 1、Cookie 2、Session&#xff08;底层基于Cookie…

RocketMQ5.0消费者

RocketMQ 5.0 提供了三种主要的消费者类型&#xff1a;PushConsumer、SimpleConsumer 和 PullConsumer。每种类型的消费者都有其特定的使用场景和特点。以下是对这三种消费者的概念及其区别的详细阐述&#xff1a; PushConsumer 概念&#xff1a; PushConsumer 是一种主动推送…

Python time模块5大隐藏特性

特性一&#xff1a;结构化时间——struct_time 简介&#xff1a; struct_time是time模块中的一个数据类型&#xff0c;用于存储一个时间的各个组成部分&#xff08;年、月、日、时、分、秒等&#xff09;。它常用于解析和格式化时间。 代码示例&#xff1a; import time # …

GA4(Google Analytics 4 )升级指南丨出海笔记

Google Analytics 4 是与之前的Universal Analytics/GA3完全不同的全新版本&#xff0c;2023下半年(7月后)会全面替换UA。 本篇指南将会展示如何安装和使用 Google Analytics 4 (GA4), 以便大家更好的迁移并使用新平台。相比GA3, GA4绝对是好东西&#xff0c;这次的内容比较硬核…

Linux基于centOS7【内存与OS的随谈】,进程初学【PCB】【fork】【进程排队】

冯诺依曼体系结构——存储器 存储器主要指的是内存&#xff0c;它有个特点就是掉电易失 磁盘等其它输入和输出设备 为什么要在计算机体系结构中要存在内存 我们知道&#xff0c;CPU的处理速度很快很快&#xff0c;但输入设备&#xff0c;以及输出设备&#xff0c;是相对很慢的…

C#对Sqllite操作

前言 数据库的操作也是程序设计中的家常便饭了&#xff0c;关系型数据库中Sqlite3是非常轻量级别的&#xff0c;所以这个数据在小型应用程序的设计中占用很高的比重。当然我这里描述的是1.0版本&#xff0c;也是最原始的方案&#xff0c;大型应用开发中一般选择EF进行桥接&…

信息学奥赛初赛天天练-54-CSP-J2019阅读程序3-二叉树、满二叉树、单侧二叉树、二分查找、递归、等差数列求和

PDF文档公众号回复关键字:20240803 2019 CSP-J 阅读程序3 1阅读程序(程序输入不超过数组或字符串定义的范围&#xff1b;判断题正确填 √&#xff0c;错误填 。除特殊说明外&#xff0c;判断题 1.5 分&#xff0c;选择题 3 分&#xff0c;共计 40 分) 01 #include <iostre…

idea项目创建提交到gitee gitee创建仓库 gitee删除仓库(全网最新最详细)

一、gitee创建仓库 1.如下图 2.创建好后如下图 3.打开idea创建好项目 3.1点击终端 3.2 从gitee页面复制命令进行运行 具体步骤如下图&#xff1a; 在步骤5时可能会提醒你远程仓库没有main分支&#xff0c;这个时候需要执行下图中的命令4创建一个远程main分支 结果运行如下图…

GATK ReferenceDataSource接口介绍

在 GATK(Genome Analysis Toolkit)库中,ReferenceDataSource 接口是一个重要的接口,用于表示与参考基因组相关的数据源。它提供了一种标准化的方式来访问和操作参考基因组的不同来源的数据。ReferenceMemorySource 类和ReferenceFileSource 类是ReferenceDataSource接口的实…

给本地设备搭建一个云端语音助手

概述 本语音助手实现了从关键词唤醒 (KWS) 到语音识别 (ASR) 再到自然语言理解 (NLU) 的完整流程。该系统可以通过监听用户的音频输入,检测指定的关键词,并将用户的语音转换为文本,最后与预设的命令进行匹配,执行相应的操作(具体实现请参考main.py),为你的设备配置远程…

ASPCMS

1.后台修改配置文件拿Shell 步骤一&#xff1a;访问以下地址为ASPCMS...并登陆到后台&#xff08;这里注意在搭建站点的时候注意权限问题&#xff09; #网站后台 http://192.168.4.139/admin_aspcms/login.asp //全功能版本 #账户密码 username:admin password:123456 步骤二…

API网关理解

项目背景介绍&#xff1a; 首先介绍一下项目背景&#xff0c;这个项目是API开发平台&#xff0c;需要完成的接口的功能是&#xff1a;统计谁调用了这个接口&#xff0c;并且将这个接口的调用次数1&#xff0c;剩余次数-1。 首先看到这个需求第一反应&#xff1a; 得先建个表…

第三期书生大模型实战营之浦语提示词工程实践

一. 基础任务 背景问题&#xff1a;近期相关研究发现&#xff0c;LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题&#xff0c;例如认为13.8<13.11。 任务要求&#xff1a;利用LangGPT优化提示词&#…

林轩田机器学习基石——笔记1.2 Learn to Answer Yes/No(如何进行学习)

When can Mechine learn&#xff1f; 2.Learn to Answer Yes/No&#xff08;如何进行学习&#xff09; 2.1perceptron hypothesis set 2.2Perceptron Learning Algorithm 2.3Guarantee of PLA 2.4Non-Separate Data Why can Mechine learn&#xff1f; How can Mechine …