浅墨小站

No mountain too high, no ocean too deep.

[C#]使用ini-parser库实现在Linux下读取INI配置文件

缘起

这几天回老家过年,带了只有Ubuntu的一台笔电,想要继续写Mimir项目,因为Mimir需要RUL来读取INI配置文件,RUL使用了Win32API来读取INI,所以在Linux下,意料之中的报了DllNotFound错。

[2019-02-04 14:44:43][Config][Error]System.DllNotFoundException: kernel32
  at (wrapper managed-to-native) RUL.INI.WritePrivateProfileString(string,string,string,string)
  at RUL.INI.Write (System.String ini_file_path_full, System.String section, System.String key, System.String val) [0x00001] in /home/romonov/RUL/RUL/INI.cs:112 
  at Mimir.ConfigWorker.Write (System.String path, System.String section, System.String key, System.String value) [0x00002] in /home/romonov/Mimir/Mimir/ConfigWorker.cs:103 

那怎么办呢?

INI文件的格式相信大家都已经是非常地熟悉,所以本文不过多赘述,接下来就是本文的主角ini-parser了。
ini-parser 是基于流的INI解析库,因为其中没有任何的Win32API调用,而是百分之百的C#代码,所以它可以跨平台使用,在Linux下也能工作(它甚至可以操作INI文件中的注释,那比Win32API可是高到不知道哪里去了)!而且它是以 MIT 协议开源的。它也可以用在Unity3D项目中哦~
ini-parser 的 Github 仓库地址是 https://github.com/rickyah/ini-parser , Nuget 程序包地址是 https://www.nuget.org/packages/ini-parser/ 。
因为有 Nuget ,所以安装起来就非常简单了,输入 Install-package ini-parser 就可以安装它到C#项目中。

食用方法

首先呢,我们需要添加两个引用:

using IniParser;
using IniParser.Model;

然后实例化一个FileIniDataParser对象,并使用它读取 config.ini 文件:

private static readonly FileIniDataParser parser = new FileIniDataParser();
IniData ini = parser.ReadFile("config.ini");

注意这里的ReadFile只要是个文本文件,并且有INI的格式就能读,所以任何扩展名都不影响。
当然也是可以从流或者字符串转换得到一个 IniData 实例的:

StreamIniDataParser streamPraser = new StreamIniDataParser();
IniData streamIni = steamParser.ReadData(SteamReader);
StringIniDataParser stringParser = new StringIniDataParser();
IniData stringIni = stringParser.ParseString(string);

之后,我们就可以对这个ini做任何想做♀的事情了。以下是一些简单的示例:

// 读写相关
string value = ini["section"]["key"];    // 读INI文件
ini["section"]["key"] = value;    // 写INI文件

// 合并
ini.Merge(praser.ReadFile("naive.ini"));    // 把 naive.ini 合并到 ini 实例中

// 注释相关
string[] commentsListOfSection = ini.Sections.GetSectionData("section").Comments;    // 读取节点下所有的注释(注意,这里不可写)
string[] commentsListOfKey = ini["section"].GetKeyData("key").Comments;    // 读写键的注释
ini.ClearAllComments();    // 清除这个INI文件所有的注释

// 最重要的:保存!
parser.WriteFile("config.ini", ini);

一定不要忘记保存,否则修改只是在程序里面的实例中存在。

最后,祝看到这里的你,春节愈快,阖家欢落,万事如意!(点名枪毙.jpg)

EOF

点赞

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

%d 博主赞过: