当前位置: 首页 > article >正文

ini-parser 使用

使用

dotnet add package ini-parser

介绍

INIFileParser 通常是指一个用于解析 INI 文件格式的类或工具。INI 文件是一个配置文件格式,通常包含键值对(key-value pairs),并且可能分为多个部分(sections)。这种格式通常用于存储程序配置、设置或者一些简单的数据。

在 C# 中实现一个 INIFileParser 类,您可以使用以下方法读取和写入 INI 文件。

基本的 INI 文件示例
假设有一个如下的 INI 文件 config.ini:

makefile
复制代码
[General]
AppName=MyApp
Version=1.0.0

[Settings]
Enabled=True
MaxUsers=100
INIFileParser 类的简单实现
下面是一个简单的 C# 实现,用于解析并操作 INI 文件:

csharp
复制代码
using System;
using System.Collections.Generic;
using System.IO;

public class INIFileParser
{
private Dictionary<string, Dictionary<string, string>> _sections;

public INIFileParser(string filePath)
{
    _sections = new Dictionary<string, Dictionary<string, string>>();
    ParseINIFile(filePath);
}

private void ParseINIFile(string filePath)
{
    string currentSection = null;
    var lines = File.ReadAllLines(filePath);

    foreach (var line in lines)
    {
        // 忽略空行和注释
        if (string.IsNullOrWhiteSpace(line) || line.StartsWith(";") || line.StartsWith("#"))
            continue;

        // 检测 section
        if (line.StartsWith("[") && line.EndsWith("]"))
        {
            currentSection = line.Trim('[', ']');
            if (!_sections.ContainsKey(currentSection))
                _sections[currentSection] = new Dictionary<string, string>();
        }
        else if (currentSection != null)
        {
            // 处理键值对
            var parts = line.Split(new[] { '=' }, 2);
            if (parts.Length == 2)
            {
                var key = parts[0].Trim();
                var value = parts[1].Trim();
                _sections[currentSection][key] = value;
            }
        }
    }
}

// 获取指定 section 和 key 的值
public string GetValue(string section, string key)
{
    if (_sections.ContainsKey(section) && _sections[section].ContainsKey(key))
    {
        return _sections[section][key];
    }
    return null;
}

// 设置指定 section 和 key 的值
public void SetValue(string section, string key, string value)
{
    if (!_sections.ContainsKey(section))
        _sections[section] = new Dictionary<string, string>();

    _sections[section][key] = value;
}

// 将解析后的 INI 内容写回文件
public void Save(string filePath)
{
    using (var writer = new StreamWriter(filePath))
    {
        foreach (var section in _sections)
        {
            writer.WriteLine($"[{section.Key}]");
            foreach (var keyValue in section.Value)
            {
                writer.WriteLine($"{keyValue.Key}={keyValue.Value}");
            }
            writer.WriteLine();
        }
    }
}

}

class Program
{
static void Main(string[] args)
{
var iniFilePath = “config.ini”;

    // 解析 INI 文件
    var iniParser = new INIFileParser(iniFilePath);

    // 获取某个值
    var appName = iniParser.GetValue("General", "AppName");
    Console.WriteLine($"AppName: {appName}");

    // 修改某个值
    iniParser.SetValue("General", "AppName", "MyNewApp");

    // 保存修改后的 INI 文件
    iniParser.Save(iniFilePath);
}

}
解释:
INI 文件解析:

通过 ParseINIFile 方法将 INI 文件解析为字典结构。_sections 字典使用 section 名称作为键,每个 section 下是一个键值对字典。
每行都检查是否为空、是注释或是 section。如果是 section 则切换到当前的 section,之后每个 key=value 形式的行都会被解析成键值对。
获取和设置值:

GetValue 方法根据 section 和 key 获取值。
SetValue 方法用于设置某个 section 下的某个键的值。如果 section 不存在,会自动创建。
保存到文件:

Save 方法将修改后的内容写回到 INI 文件。它遍历所有的 section 和键值对,写入文件。
扩展功能
删除键或 section:可以在 INIFileParser 类中加入方法来删除某个 section 或键。
支持更多数据类型:当前实现将所有值视为字符串,您可以扩展它,支持如布尔值、整数等不同类型的值。
使用示例:
假设您有一个 config.ini 文件:

makefile
复制代码
[General]
AppName=MyApp
Version=1.0.0

[Settings]
Enabled=True
MaxUsers=100
运行上面的程序后,您可以进行以下操作:

获取值:获取 General 部分的 AppName:

csharp
复制代码
var appName = iniParser.GetValue(“General”, “AppName”);
Console.WriteLine(appName); // 输出: MyApp
修改值:将 General 部分的 AppName 修改为 MyNewApp:

csharp
复制代码
iniParser.SetValue(“General”, “AppName”, “MyNewApp”);
保存文件:修改后的内容会保存回文件:

csharp
复制代码
iniParser.Save(“config.ini”);
总结:
INIFileParser 主要用于处理 INI 格式的配置文件。您可以将其扩展为支持更多功能,比如更复杂的配置格式或错误处理等。通过提供默认值和易于操作的方法,可以让 INI 文件成为项目的灵活配置方式。


http://www.kler.cn/a/396979.html

相关文章:

  • 【大数据学习 | HBASE高级】hive操作hbase
  • Spark RDD sortBy算子什么情况会触发shuffle
  • ubuntu 22.04 shell
  • 路由器基本原理与配置
  • Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别
  • 深度学习和图像处理
  • 大模型(LLMs)微调篇
  • Linux 用户账户信息配置文件详解
  • 快速认识和上手Protobuf
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的解决方案
  • 如何使用 XML Schema
  • 从0安装mysql server
  • flask+vue使用jwt验证
  • 躺平成长-人工智能进行编程-(12)
  • notepad++下载安装教程
  • SpringBoot项目实现登录——集成JWT令牌和验证码的登录业务
  • 网络安全审计
  • 什么是SSL VPN?其中的协议结构是怎样的?
  • 自动化测试工具Ranorex Studio(三十四)-自定义报告模板
  • 基于微信小程序的公务员考试学习平台的设计与实现,LW+源码+讲解
  • 解答疑问,为什么在本地明明拉取了镜像,但是k8s-pod依旧ImagePullBackOff
  • STM32 ADC --- 任意单通道采样
  • 社交媒体的隐私新标准:Facebook的数据保护策略
  • NDNF-RNASeq
  • Prometheus 和 Grafana 以进行服务器监控
  • 【微软报告:多模态基础模型】(1)从专家到通用助手