欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.NET开源类库Nini手册(INI、XML、注册表的配置应用)-中文翻译

程序员文章站 2022-03-22 14:24:09
作为开发人员,您始终需要处理应用程序配置数据。常见的示例是INI 文件,XML文件, .NET配置文件(也称为“ .config”),Windows注册表和命令行(argv)参数。配置文件的优点是它们加载速度快,不占用大量空间且易于编辑。Nini是一个功能强大的 .NET配置库,旨在帮助快速构建高度... ......

nini .net配置库()
vb代码的注释我保留了原文注释,它和c#注释的内容是一样的,下载链接在文章末尾。

1.简介

1.1什么是应用程序配置数据?

作为开发人员,您始终需要处理应用程序配置数据。常见的示例是ini 文件,xml文件, .net配置文件(也称为“ .config”),windows注册表和命令行(argv)参数。配置文件的优点是它们加载速度快,不占用大量空间且易于编辑。

1.2问题

尝试创建配置文件访问方案不能满足程序员或最终用户的需求。为了给出真实的生活场景,我为一个使用windows注册表api(应用程序编程接口)配置其原始程序的组织工作。后来,他们开发了自己的asp配置类。大约在同一时间,另一个小组开发了一个api,该api可从数据库中获取数据。然后,当asp.net出现时,他们开始使用web.config。在短短的几年之内,配置数据源的数量就从一增加到了四个!不用说,获取配置数据通常成为一项艰巨的任务。以下是可以改进配置管理的三个主要方面:

  • api
    开发人员使用配置文件格式,以使其应用程序在尽可能短的时间内运行。但是,通常在事后才添加用于访问此数据的api,从而导致api不够灵活。在很小的应用程序中,这可能不是问题,但是随着程序代码库的增长,配置信息通常会遍及整个应用程序代码。
  • 最终用户
    配置文件通常不会考虑最终用户。通常,配置选项是简洁的编程术语,只有最勇敢的用户才敢更改它们。这导致开发人员不得不编写复杂的配置文件编辑器,或更糟糕的是,它们会完全重新设计其原始api。
  • 多个配置源
    随着您软件的成熟,添加更多应用程序配置类型的情况并不少见(例如我之前给您的示例)。这通常是由于合并其他项目中的代码,新的改进格式以及迁移到不同的编程平台而引起的。这迫使程序员学习多个api。最终结果是代码不一致,也不适合新程序员。不会替换旧的配置文件,因为程序员及其经理不适应更改成熟的代码。编辑文件的用户可以抵制此更改,因为他们希望不学习新的文件格式。

1.3介绍nini

nini是一个功能强大的 .net配置 库,旨在帮助快速构建高度可配置的应用程序。nini提供了一种解决方案,试图消除上述问题。它提供了一个大型功能集,可为您提供从概念到成熟产品的每个阶段都将使用的功能。这是通过简单但灵活的api实现的,该api提供了对基础配置源的抽象。它解决了我上面描述的所有问题。我们将在下面的示例中看到如何完成此操作。

2.入门

2.1一个简单的例子

为了向您展示nini如何解决这些问题,让我们来看一个示例。首先,让我们看一个示例配置文件。对于本手册中的大多数示例,我将选择ini 格式。ini文件是一种久经考验的真实配置文件类型,用于诸如mysql,php和samba之类的著名开源项目 。实际上,nini支持多种ini文件类型。它们非常简单且易于编辑,因此仍然是非常受欢迎的选择。nini包含它自己的ini解析器类(inidocument),该类 完全用c#编写,没有 windows api代码,因此它是跨平台的。这是此示例的myapp.ini文本:

; myapp.ini
[logging]
file name = myapp.log
messagecolumns = 5
maxfilesize = 40000000000000

以下是一段c#示例代码,它描述了如何从上述文件中的ini文件访问配置数据:

using nini.config;
iconfigsource source = new iniconfigsource("myapp.ini");

string filename = source.configs["logging"].get("file name");
int columns = source.configs["logging"].getint("messagecolumns");
long filesize = source.configs["logging"].getlong("maxfilesize");

这是vb中的示例:

imports nini.config

dim source as new iniconfigsource("myapp.ini")

dim filename as string = source.configs("logging").get("file name")
dim columns as integer = source.configs("logging").getint("messagecolumns")
dim filesize as long = source.configs("logging").getlong("maxfilesize")

好的,那个例子给您带来了一些麻烦。首先,我们使用nini.config将nini的配置名称空间包含在虚构的应用程序中。接下来,我们使用iniconfigsource 类加载ini文件。在nini中,每种配置文件类型都有其自己的“ source”类。此类知道如何加载和保存文件。这些类中的每一个都实现iconfigsource 接口,因此您可以更轻松地抽象地使用多种配置类型。加载文件后,所有部分(在本例中为[logging]部分)都将转换为接口iconfig。 并添加到source类的集合中。iconfig类提供了非常快速的访问权限,以检索,添加或删除配置密钥(例如上述ini文件中的“文件名”)。iconfig类的方法包括 getgetstringgetintgetfloatgetdoublegetlong 方法。所有以“ get”为前缀的方法都将重载以提供更多数据。接下来的几节描述了如何使用这些重载。

2.2默认值

有时,配置文件中不会出现选项。这可能是因为尚未将其添加到项目的主版本中,或者应将其对用户保密。对于这些情况,nini提供了重载的方法,这些方法允许程序员定义默认值。

这是c#中的示例:

// 将缺少默认值设置为 "default result".
string missing = config.get("missing config", "default result");

// 设置smallnumber为默认值,50
int smallnumber = config.getint("not present", 50);

这是vb中的相同示例:

' sets missing to the default value, "default result".
dim missing as string = config.get("missing config", "default result")

' sets smallnumber to the default value, 50.
dim smallnumber as integer = config.getint("not present", 50)

2.3设置、保存和删除键

也可以设置新值并将其保存到配置文件中。调用set方法将更改现有值,或者如果不存在则将其添加。这是一个例子:

config.set("file name", "mynewfile.log");
config.set("messagecolumns", 45);
config.remove("file name");
    
source.save();

但是,有必要调用save方法来保存文件,但是,您还可以在iconfigsource上设置autosave属性,并且每次调用set方法时,该属性都会自动保存文件。如果要将文档保存到其他路径或对象,则iniconfigsourcexmlconfigsourcedotnetconfigsource 类都保存重载的save方法,这些方法使您可以保存到新路径或textwriter:

这是c#中的示例:

using system.io;
    
iniconfigsource source = new iniconfigsource("test.ini");
stringwriter writer = new stringwriter();
source.save(writer); // 保存到stringwriter(textwriter)

source.save("some/new/path.ini"); // 保存到新路径

这是vb中的示例:

imports system.io
    
dim source as iniconfigsource = new iniconfigsource("test.ini")
dim writer as new stringwriter()
source.save(writer) ' save to stringwriter(textwriter)

source.save("some/new/path.ini") ' save to new path

2.4添加和删除配置

在特定情况下,您将需要自己添加和删除iconfigs。nini具有完成这两项操作的简单方法。这是我创建新配置然后立即将其删除的示例。

这是c#中的示例:

iconfig newconfig = source.addconfig("newconfig");

source.configs.remove(newconfig);

这是vb中的示例:

dim newconfig as iconfig = source.addconfig("newconfig")
    
source.configs.remove(newconfig)

2.5键值扩展

在许多情况下,您会发现您的键值取决于其他键的值。例如,您有一个根路径配置值,以及使用此路径的文件的多个值,例如以下示例:

[file path]
rootpath = c:\program files\my program
logging = myapp.log
webpage = index.html

如果没有nini,则如果要将“ rootpath”的值与“ logging”和“ webpage”结合使用,则必须执行难看的字符串连接才能获得“ c: program files  my program  index.html”。在nini中,您不需要这样做:

[file path]
rootpath = c:\program files\my program
logging = ${rootpath}\myapp.log
webpage = ${rootpath}\index.html

这可以为您自己串联它们省去很多麻烦,并使您的代码更整洁。如果要从其他部分获取值,则可以执行上述操作,但是要在部分名称后添加一个横条(“ |”),如下所示:$ {section | key}。当您准备执行替换时,请调用expandkeyvalues(注意:以前称为replacekeyvalues)

这是c#中的示例:

iconfigsource source = new iniconfigsource("myapp.ini");
source.expandkeyvalues();

这是vb中的示例:

dim source as new iconfigsource("myapp.ini")
source.expandkeyvalues()

调用expandkeyvalues时,它会一次更改配置文件中的所有键。这使代码执行更快,因为它不需要替换每个get / getstring / getint / etc调用上的键值。但是,这意味着如果要使用保存配置文件,它将用扩展值覆盖以前的值。如果您不希望发生这种情况,则可以使用getexpanded方法。

; 这会将日志记录设置为 "c:\program files\my program\myapp.log"
iconfigsource source = new iniconfigsource("myapp.ini");
string logging = source.configs["file path"].getexpanded("logging");

这就是创建第一个nini配置的应用程序很容易。以下各节将介绍nini的一些更高级的功能。

3.高级主题

3.1合并

合并是一项非常强大的功能,允许开发人员将来自多个源的配置数据组合到一个对象中。您可以将无数种不同的配置类型组合到一个iconfigsource中!您可以将多个ini,xml和注册表文件添加到同一对象中。你觉得很酷吗?这是一个如何将ini文件与xml文件合并的示例。

这是c#中的示例:

iconfigsource mainsource = new iniconfigsource("myapp.ini");
iconfigsource xmlsource = new xmlconfigsource("myapp.xml");
mainsource.merge(xmlsource);

// 现在,您可以从mainsource和xmlsource访问任何iconfig
string xmlvalue = mainsource.configs["somexmlsection"].get("anoption");

这是vb中的示例:

dim mainsource as new iniconfigsource("myapp.ini")
dim xmlsource as new xmlconfigsource("myapp.xml")
mainsource.merge(xmlsource)

' now you can access any iconfig from mainsource and xmlsource
dim xmlvalue as string = mainsource.configs("somexmlsection").get("anoption")

当数据在文件之间合并时,任何同名的iconfig或包含相同密钥的iconfig都将覆盖之前的文件。对于具有不同配置需求的客户端的用户来说,这非常重要。您可以在一个文件中创建默认配置设置,并具有特定于客户端的文件,如果需要,该文件将覆盖主文件的设置。这将节省您大量的工作。它对我有用。

3.2价值别名

许多配置文件的选项对于程序员来说是清楚的,但对非程序员来说却很混乱。为了使非程序员更容易理解配置文件,一种常见的做法是使键和值更像普通的人类对话框那样读取。让我们看一个示例,说明如何使用易于理解的字符串值返回布尔值。首先,让我们从aliasexample ini文件开始:

; aliasexample.ini
[web browser]
block popups = on
check for default browser = off
error level = warn

如您所见,我不是使用每个键的值都使用“ 1”或“ true”之类的值,而是使用了“ on”和“ off”,希望它们可以使用户更容易理解。您还将注意到,每个值之间的大小写不完全是大写或小写。我这样做是为了提出观点。用户很难记住要在特定键值中放置什么值,因此要使它们变得更容易一点也不 要使他们也记住要使用哪种情况!忽略大小写的问题是您的代码看起来很丑陋,如以下示例所示:

bool blockpopups = (config.get("block popups").tolower() == "on");

让我们为该文件定义一些规则,使它们成为规则。我们希望 blockpopups部分的 值在值设置为“ on”时返回布尔值true,而在值设置为“ off”时返回false值。此外,我希望错误级别将整数值设置为“ warn”时返回100,而将值设置为“ error”时返回200。下面的代码显示如何向iconfigsource的alias属性添加规则,该属性定义了我在上一段中刚刚定义的规则。

这是c#中的示例:

iconfigsource source = new iniconfigsource("aliasexample.ini");
    
// 创建两个布尔别名。
source.alias.addalias("on", true);
source.alias.addalias("off", false);

// 设置两个整数别名。
source.alias.addalias("error level", "warn",  100);
source.alias.addalias("error level", "error", 200);

iconfig config = source.configs["web browser"];
bool blockpopups = config.getboolean("blockpopups");
int errorcode = config.getint("error code", true);

这是vb中的示例:

dim source as new iniconfigsource("aliasexample.ini")
    
' creates two boolean aliases.
source.alias.addalias("on", true)
source.alias.addalias("off", false)

' sets two integer aliases.
source.alias.addalias("error level", "warn",  100)
source.alias.addalias("error level", "error", 200)

dim config as iconfig = source.configs("web browser")
dim blockpopups = config.getboolean("blockpopups")
int errorcode = config.getint("error code", true)

addalias的前两个调用 将布尔值添加到文本“ on”和“ off”。此方法的接下来的两个调用将别名文本添加到“错误级别”配置中,并将文本分别为“警告”和“错误”以及数字值100和200。接下来,我获取了关键数据。getint方法已重载,因此,如果参数设置为true,则它将以别名而不是文字整数值加载数据。

3.3键值清单

nini没有用于返回信息列表的专用方法。这是因为 .net framework 的string.split方法已经有了使用小技巧的 方法。这是一个ini文件,其中服务器列表由竖线(“ |”)分隔符分隔:

[mailservers]
serverlist = "http://mail.yahoo.com/|http://www.hotmail.com/|http://www.mail.com/"

现在,使用split方法,我们将服务器列表作为字符串数组返回:

string[] serverlist = source.configs["mailservers"].get("serverlist").split('|');

这是vb中的示例:

dim serverlist() as string = source.configs("mailservers").get("serverlist").split('|')

您可以使用split方法使用任意数量的分度器。要有创造力。只需选择一个不会用作键值的分度符即可。

3.4活动

nini允许开发人员以非连接方式执行操作,从而使事情变得容易。通常,第一个对象可以只使用iconfig,而不必担心其他对象如何使用它。但是,有时候知道更改配置数据的时间很有用。nini添加了许多事件来帮助处理这些情况。

在以下情况下,类需要在保存iconfigsource时通知。

这是一个c#示例:

void sourceload()
{
  source = new iniconfigsource();
  source.saved += new eventhandler(this.source_saved);
}

void source_saved(object sender, eventargs e)
{
  // 在这里执行保存操作
}

这是一个vb示例:

sub sourceload()
{
  source = new iniconfigsource()
  source.saved += new eventhandler(me.source_saved)
}

sub source_saved(sender as object, e as eventargs) handles source.saved
{
  ' perform save actions here
}

还有更多事件,例如load,keyset,keyremoved,configadded和configremoved。

4.配置类型

4.1 ini文件

nini具有使用100%c#编写的内置ini解析器。这意味着,与其他ini解析器不同,它将在任何.net平台上运行,而不仅仅是运行windows的平台。另外,解析器的编写旨在提高灵活性,这就是为什么它支持多种ini文件类型的原因。当前支持的文件类型如下:

  • windows style (win32 api getprivateprofilestring)
  • mysql style
  • python style
  • samba style
  • nini standard
    区分大小写
    iniconfigsource类具有一个允许值不区分大小写的属性。对于使用不区分大小写的旧win32 api getprivateprofilestring函数从系统升级软件的人们,这可能是理想的。这是一个如何使用它的示例:
; 注意,load方法只是将文件名传递给构造函数的替代方法。
iconfigsource source = new iniconfigsource();
source.load("myapp.ini");
source.casesensitive = false;

4.2 xml文件

nini拥有自己的xml配置文件结构。与.net配置文件格式相比,它提供了更大的灵活性。它的主要优点是您可以拥有多个xml配置文件,并且格式更加简洁。这是格式的示例。您会发现它非常类似于ini文件。配置值与先前示例中的ini相同:

<!-- myapp.xml -->
<nini>
    <section name="logging">
        <key name="file name" value="myapp.log" />
        <key name="messagecolumns" value="5" />
        <key name="maxfilesize" value="40000000000000" />
    </section>
</nini>

加载文件非常简单:

// 加载xml文件
xmlconfigsource source = new xmlconfigsource("myapp.xml");
// 检索值
long maxfilesize = source.configs["logging"].getlong("maxfilesize");

这是vb中的示例:

' loads the xml file
dim source as new xmlconfigsource("myapp.xml")
' retrieves a value
dim maxfilesize as long = source.configs("logging").getlong("maxfilesize")

4.3 windows注册表配置

如果您使用的是许多microsoft windows操作系统之一,则可以从windows注册表访问数据。这是注册表项的示例键路径:

hkey_local_machine\sofware\myapp\logging
"file name"       "myapp.log"  reg_sz
"messagecolumns"  "5"          reg_dword
"maxfilesize"     "40000000"   reg_dword

要访问此代码,该方法比其他方法要复杂一些。您必须创建到注册表项的映射。此功能还将使您能够将许多注册表项合并到一个iconfigsource中。这是一些访问它的示例代码。

这是c#中的示例:

using microsoft.win32;
registryconfigsource source = new registryconfigsource();
// 加载注册表树
source.addmapping(registry.localmachine, "software\\myapp\\logging");
// 检索值
long maxfilesize = source.configs["logging"].getlong("maxfilesize");

这是vb中的示例:

imports microsoft.win32
dim source as new registryconfigsource()
' loads the registry tree
source.addmapping(registry.localmachine, "software\\myapp\\logging")
' retrieves a value
dim maxfilesize as long = source.configs("logging").getlong("maxfilesize")

如果您想递归地检索指定注册表项下的所有数据,也可以使用一种方法来完成。

如果要使所有子键位于具有统一名称的键下,则可以执行以下操作:

using microsoft.win32;
// 加载注册表树及其下的所有节点
registryconfigsource source = new registryconfigsource();
source.addmapping(registry.localmachine, "software\\myapp", registryrecurse.flattened);

string maxfilesize = source.configs["myapp"].getstring("someconfig");
long maxfilesize = source.configs["logging"].getlong("maxfilesize");

这是vb中的示例:

imports microsoft.win32
' loads the registry tree and all nodes beneath it without 
dim source as new registryconfigsource()
source.addmapping(registry.localmachine, "software\\myapp", registryrecurse.flattened)

dim maxfilesize as string = source.configs("myapp").getstring("someconfig");
dim maxfilesize as long = source.configs("logging").getlong("maxfilesize")

4.4 .net配置文件

.net framework具有使用特定xml格式的自己的配置文件机制 。您可能在asp.net中以web.config 文件的形式熟悉它们。如果将它们与windows窗体,控制台应用程序或服务一起使用,则将它们称为[app name] .exe.config文件。为了支持仍在其应用程序中使用此配置文件格式的用户,nini也支持这些文件。

<!-- exampleapp.exe.config -->
<configuration>
    <configsections>
        <section name="logging" type="system.configuration.namevaluesectionhandler" />
    </configsections>
    <logging>
        <add key="file name" value="myapp.log" />
        <add key="messagecolumns" value="5" />
        <add key="maxfilesize" value="40000000000000" />
    </logging>
</configuration>

访问数据与加载ini或xml文件非常相似:

iconfigsource source = new dotnetconfigsource(dotnetconfigsource.getfullconfigpath());

string filename = source.configs["logging"].get("file name");
int columns = source.configs["logging"].getint("messagecolumns");
long filesize = source.configs["logging"].getlong("maxfilesize");

这是vb中的示例:

dim source as new dotnetconfigsource(dotnetconfigsource.getfullconfigpath())

dim filename as string = source.configs("logging").get("file name")
dim columns as integer = source.configs("logging").getint("messagecolumns")
dim filesize as long = source.configs("logging").getlong("maxfilesize")

4.5命令行(argv)配置

自从编程开始以来,应用程序就具有接受命令行开关的能力。这些开关只是在应用程序首次启动时传递给应用程序的字符串。windows程序xcopy具有许多命令行 开关 ,而出色的下载应用程序wget也具有其自己的 。如果您想更多地了解.net中命令行参数的工作方式, 请单击此处(链接无效)。我们的第一个示例与您迄今为止看到的其他示例非常相似。区别在于 addswitch 需要为每个键配置调用方法。有一个短键和一个长键可用于获取配置数据。

这是c#中的示例:

public static int main(string[] args)
{
   argvconfigsource source = new argvconfigsource(args);

   source.addswitch("logging", "file-name", "f");
   source.addswitch("logging", "columns", "c");
   source.addswitch("logging", "max-file-size", "m");

   if(args.length > 0)
   {
      string filename = source.configs["logging"].get("file-name");
      int columns = source.configs["logging"].getint("columns");
      long filesize = source.configs["logging"].getlong("max-file-size");
   }
}

这是vb中的示例:

public static function main(args() as string) as integer
   dim source as new argvconfigsource(args)

   source.addswitch("logging", "file-name", "f")
   source.addswitch("logging", "columns", "c")
   source.addswitch("logging", "max-file-size", "m")

   if (args.length > 0) then
      dim filename as string = source.configs("logging").get("file-name")
      dim columns as integer = source.configs("logging").getint("columns")
      dim filesize as long = source.configs("logging").getlong("max-file-size")
   end if
end function

5.有效使用nini

5.1多个用户的处理配置

您可能会注意到,.net 1.0和1.1的configurationsettings类仅提供检索配置值的方法。这是因为对于程序员来说,以编程方式更改整个应用程序的配置值通常是一个坏主意。全局配置应用程序的方式由管理员决定。因此,我建议您不要更改应用程序级别设置。

但是,至关重要的是,您必须允许用户根据自己的个人喜好配置应用程序。nini允许您创建许多不同的配置文件源,因此只需将配置文件放在正确的目录中即可。windows程序的标准是应用程序数据目录:

c:\documents and settings[username]\local settings\application data[application name]\settings.ini

您可以通过以下路径以编程方式获取此路径:

string folder = environment.getfolderpath(environment.specialfolder.applicationdata);

5.2在数据库中存储配置数据

如果您正在运行asp.net应用程序,则每个系统中可能会有多个用户。您可能还需要编辑许多用户设置。大多数web应用程序都完全配置有数据库,因此以下是将nini与数据库一起使用的示例。

这是一个带有sql server表的非常简单的示例。这可以很容易地适应任何其他数据库。这是数据库表的结构:

create table usersettings
(
   userid id,
   settings text
);

configsettings字段存储nini配置值。现在,您可以像这样加载nini配置值:

string userid = getuserid(); // retrieve the user id somehow

sqlcommand command = new sqlcommand("select settings from usersettings where id = "
                                     + userid, connection);

connection.open();

sqldatareader reader = command.executereader();

if(reader.hasrows) {
    reader.read();
    iconfigsource source = new xmlconfigsource(new stringreader(reader.getstring(0)));
}

reader.close();
connection.close();

5.3自动创建配置文件

对于任何开发项目而言,能够自动创建构建都是必不可少的。有几种工具可以完成此任务,例如批处理(.bat)脚本,但是.net framework最受欢迎的选择可能是 nant。您可能会发现自己需要使用构建管理系统来创建配置文件。为了使这些工作更轻松,nini项目提供了niniedit(nini命令行配置编辑器)。使用此应用程序,您可以创建和编辑任何基于文件的配置数据。ninieditor包含在examples目录中的每个nini版本中。

让我们添加一个示例,说明如何在构建中使用niniedit。在第一个示例中,假设您的构建是一个批处理文件,并且您需要以编程方式创建以下ini文件:

[general]
debug = false
logging = on
[logging]
filepath = c:\temp\myapp.log

以下调用将自动创建配置文件:

:: create the new configuration file
niniedit --new --set-type=ini myapp.ini
niniedit --add=general myapp.ini
niniedit --add=logging myapp.ini
niniedit --config=general --set-key=debug,false myapp.ini
niniedit --config=general --set-key=logging,on myapp.ini
niniedit --config=logging --set-key=filepath,c:\temp\myapp.log myapp.ini

如果您在nant中执行相同的操作,则可以执行以下操作:

<exec program="niniedit" commandline="-n -s ini myapp.ini" />
<exec program="niniedit" commandline="-a general myapp.ini" />
<exec program="niniedit" commandline="-a logging myapp.ini" />
<exec program="niniedit" commandline="-c general -k debug,false myapp.ini" />
<exec program="niniedit" commandline="-c general -k logging,on myapp.ini" />
<exec program="niniedit" commandline="-c logging -k filepath,c:\temp\myapp.log myapp.ini" />

这里的所有都是它的。niniedit具有其他功能,例如列出配置,键,键值和删除键的功能。如果没有其他问题,请以niniedit为例,说明如何使用nini编写自己的命令行应用程序。

5.4以编程方式创建配置文件

有时,使用应用程序以编程方式创建配置文件可能会很有用。使用nini进行此操作非常容易。

假设您要创建在任一示例中创建的相同ini文件:

[general]
debug = false
logging = on
[logging]
filepath = c:\temp\myapp.log

在代码中创建代码的方法如下:

iniconfigsource source = new iniconfigsource();

iconfig config = source.addconfig("general");
config.set("debug", "false");
config.set("logging", "on");

config = source.addconfig("logging");
config.set("filepath", "c:\\temp\\myapp.log");

source.save("myapp.ini");

5.5为您的应用程序选择正确的配置文件类型

nini的编写旨在使所有配置文件类型都成为一流公民。这是因为每种配置文件类型都有其自身的优点和缺点。下面的列表包含一些基本准则:

ini

  • 速度-文件类型的解析速度非常快,因此它的加载和保存速度可能比其他类型更快。
  • 可读性-在配置类型中,这可能对用户最不可怕。如果您要让用户手动更改此配置文件,那么我强烈建议您使用此格式。
  • 安装程序-ini文件受许多类型的安装程序支持(wise,nsis,仅举几例)。如果您需要构建来编辑这些文件,那么绝对可以这样做。

xml

  • 速度-xml解析器要加载很多信息,因此这可能是最慢的。
  • 可读性-这种格式对于初学者来说有点吓人。
  • 支持-所有编程语言都支持此功能,因此,如果其他应用程序正在访问数据,那么这是一个很好的类型。
  • 安装程序-由于配置文件没有标准的xml格式,因此安装程序通常不支持此格式。

.net配置文件

  • 速度-xml解析器要加载很多信息,因此这可能是最慢的。
  • 可读性-这种格式对于初学者来说有点吓人。
  • 安装程序-.net framework将这些配置文件用于其他配置。如果将.net配置和您自己的应用程序配置选项混合使用,我建议不要使用它。

windows注册表

  • 速度-快速检索配置数据。随着注册表越来越多地填充数据,检索速度的确会变慢。这被认为是定期重新安装windows可以使计算机运行更快的原因之一。
  • 可读性-如果您确实不希望用户能够配置应用程序,则应使用此类型。触摸注册表可能会导致严重问题,因此建议除非必要,否则不要使用它。但是,请注意,如果您的支持人员需要用户调整配置设置,他们将遇到与用户相同的问题。除此之外,配置文件编辑器是众所周知的并且很成熟。
  • 安装程序-大多数安装程序支持读取和编辑注册表项,因此这是一个不错的选择。
    没有完美的配置类型,因为每个配置都有自己的优势。如果最终选择的配置文件类型不适合您的情况,则不要惊慌。nini提取了您要访问的文件类型,因此您必须更改的代码量应该最少。

本教程就是这样。希望对您有所帮助!如果您有任何关于改进本手册的问题或建议,请访问nini主页,并使用论坛,错误跟踪器或功能请求工具来表达自己的意见。

附件:获取nini