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

ini

Initialization

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

这种配置文件的文件扩展名多为INI

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

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

csharp 复制代码
[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文件的读取和写入,并提供了一些简单的查询功能。

csharp 复制代码
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);



///如删除配置项、删除部分、处理注释等也支持的
自己封装方法读取
csharp 复制代码
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;
}
csharp 复制代码
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文件。

csharp 复制代码
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;
        }
    }
}
csharp 复制代码
        /// <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

相关推荐
亚林瓜子11 小时前
Jackson注解屏蔽某些字段读取权限
spring·json·jackson
不惑_17 小时前
最佳实践 · 如何高效索引MySQL JSON字段
java·mysql·json
readmancynn1 天前
XML_Tomcat_HTTP
xml·http·tomcat
我是全栈架构师1 天前
Dom4j使用xpath查询xml文
xml
cyt涛1 天前
MyBatis之手动映射
xml·数据库·mybatis·查询·resultmap·手动映射
天上掉下来个程小白1 天前
请求响应-05.请求-日期参数&JSON参数
spring boot·json
敲代码不忘补水1 天前
Python Pickle 与 JSON 序列化详解:存储、反序列化与对比
开发语言·python·json
齐 飞1 天前
使用jackson将xml和对象、List相互转换
xml·java·spring boot·后端·list
代码代码快快显灵2 天前
XML标记语言
xml·java·数据库
jackletter2 天前
c#:System.Text.Json 的使用四(如何忽略[JsonPropertyName])
c#·json·序列化