.NET平台開源項目速覽(1)SharpConfig配置文件讀寫組件


  在.NET平台日常開發中,讀取配置文件是一個很常見的需求。以前都是使用System.Configuration.ConfigurationSettings來操作,這個說實話,搞起來比較費勁。不知道大家有沒有同感。所以更多時候我還是喜歡使用開源的東西,更加方便簡潔,也穩定。省去自己的麻煩。今天就介紹一個非常精致的.NET平台開源的操作配置文件(cfg/ini)的組件SharpConfig。走過路過,千萬不要錯過!上周我在這些.NET開源項目你知道嗎?讓.NET開源來得更加猛烈些吧一文中也介紹過項目。我將會重點對部分開源項目進行深入的研究,形成“.NET平台開源項目速覽”系列文章,該系列文章沒有時間限制,會一直持續更新下去。

.NET開源目錄:【目錄】本博客其他.NET開源項目文章目錄

 本文原文地址:.NET平台開源項目速覽(1)SharpConfig配置文件讀寫組件

1.SharpConfig簡介

    SharpConfig是.NET平台一個使用非常簡單的處理Cfg/ini配置文件的類庫。

    項目主頁:https://github.com/cemdervis/SharpConfig,目前最新版本是1.4.3;

    Nuget包主頁:https://www.nuget.org/packages/sharpconfig/,其主要功能有:

    1.支持的配置文件類型有cfg,ini格式;

    2.支持注釋功能,使用 # 符號開頭;

    3.支持直接讀取和寫入指定節點的值;

    4.支持枚舉,數組,以及和實體的直接映射;

    5.支持內存的創建和使用,相對一個配置類型,直接在代碼中初始化和使用;

2.SharpConfig基本使用

    下面通過一個簡單的Demo來大概知道如何使用。下載后,解壓,新建項目,添加dll引用,需要添加命名空間:

using SharpConfig;

    我們添加一個如下格式的文件,文件名稱為:example.ini,這個文件可以手動創建放在項目中,設置屬性:“始終復制”即可,或者自己手動復制到bin目錄也行。方便調用,放在其他路徑也可以,最終都是fileName的路徑來找文件的。example.ini的內容如下,這個例子也是項目主頁的例子,我稍微修改了下:

[General] #這代表Section,也就是節點

SomeString = Hello SharpConfig!

SomeInteger = 10 #這里也是注釋

SomeFloat = 20.05

ABoolean = true

    下面使用代碼直接讀取這個配置文件的值:

static void Test1()
{
	//按文件名稱加載配置文件
	Configuration config = Configuration.LoadFromFile("example.ini");
	//按照節的名稱讀取節
	Section section = config["General"];
	//依次根據每個配置項的名稱來讀取,如果配置文件類型搞錯了,會報錯
	string someString = section["SomeString"].Value;
	var someInteger = section["SomeInteger"].GetValue<Boolean>();
	float someFloat = section["SomeFloat"].GetValue<float>();
	Boolean someBool = section["ABoolean"].GetValue<Boolean>();
	Console.WriteLine("當前節名稱:{0}",section.Name );
	Console.WriteLine("字符串SomeString值:{0}", someString);
	Console.WriteLine("整數someInteger值:{0}", someInteger);
	Console.WriteLine("雙精度someFloat值:{0}", someFloat);
	Console.WriteLine("布爾值someBool值:{0}", someBool);
}

結果如下:

blob.png保存配置文件有以下一些方法:

myConfig.Save( "myConfig.cfg" ); // 保存到cfg格式的文本文件
myConfig.Save( myStream ); //保存到文本流中
myConfig.SaveBinary( "myConfig.cfg" ); //保存到cfg格式的二進制文件
myConfig.SaveBinary( myStream ); // 保存到二進制文件

    是不是很簡單,速度也很快。下面看看其他功能的使用。上面只是一個最基本的使用例子。

3.特殊數據類型的配置項目

3.1 枚舉類型

    枚舉類型的支持其實和上面的值類型差不多,也是直接使用泛型的類型參數類獲取枚舉,而數組是相對特殊一點的,所以單獨拿出來給大家介紹。

    假設有一個Section名稱為DateInfo,項目的Day有一個Monday值,是枚舉類型DayOfWeek的一個值。如下面所示:

    [DateInfo]

    Day = Monday

    調用的時候,使用一個枚舉類型DayOfWeek 來讀取:

DayOfWeek day = config["DateInfo"]["Day"].GetValue<DayOfWeek>();

3.2 數組類型

    數組類型的支持,首先是統一轉換為object數組,然后根據自己的需求要手動轉換,其實可以寫一個擴展方法,很簡單,就不展開了。例如下面有一個節的項目是:

    [General]

    MyArray = {0,2,5,6}

    讀取的方法為:

object[] myArray = config["General"]["MyArray"].GetValue<object[]>();

4.動態創建配置文件與使用

    動態在內存中創建配置文件,其實就是把Configuration當作一個實體類一樣,在代碼中創建和使用。例如下面的代碼:

static void Test2()
{
	var myConfig = new Configuration();
	//節點Video
	myConfig["Video"]["Width"].Value = "1920";
	myConfig["Video"]["Height"].Value = "1080";
	//設置數組
	myConfig["Video"]["Formats"].SetValue(new string[] { "RGB32", "RGBA32" });
	//可以使用循環獲取節點以及節點的所有項目,進行操作
	foreach ( var section in myConfig )
	{
		foreach ( var setting in section )
		{
			//TODO:
		}
	}
	//也可以直接使用節點和項目的名稱來訪問:
	Console.WriteLine("Width:{0}", myConfig["Video"]["Width"].GetValue<Int32>());
	Console.WriteLine("Height:{0}", myConfig["Video"]["Height"].GetValue<Int32>());
}

  結果如下:

5.更簡單的應用-對象映射

  在文章發表之前,我在“這些.NET開源項目你知道嗎?讓.NET開源來得更加猛烈些吧”一文中已經提到該項目,網友回復如果字符串中包括了#字符,可能會被認為是注釋的事情,這個的確是一個隱藏bug,不過應該很少會碰到,這個解決方案自己繞過彎吧,真的有,就在程序或者使用實體類映射的時候,單獨處理一下。

    這種情況在以前使用XCode組件時用的比較多。不過SharpConfig也支持,挺好用的。相當於把實體類的字段和配置文件對應起來,可以更加方便使用。類型和配置文件映射后,可以直接操作對象了。不需要上面那些步驟。假設有一個Person對象,如下格式:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Gender Gender { get; set; }
}

Gender是一個性別的枚舉類型,如下所示:

enum Gender
{
    Male,
    Female
}

假設配置文件是這樣保存的:

[Person]

Name = Peter

Age = 50

Gender = Male

    在實際使用的時候,使用下面的代碼即可:

static void Test3()
{
	Configuration config = Configuration.LoadFromFile("example.ini");
	Person person = config["Person"].CreateObject<Person>();
	Console.WriteLine("Name:{0}",person.Name);
	Console.WriteLine("Age:{0}", person.Age);
	Console.WriteLine("Gender:{0}", person.Gender);
}

結果如下:

blob.png

   當然也可以將config["Person"]節直接映射對一個已經存在的對象,會直接覆蓋原來的值。如下面代碼:

config["Person"].MapTo(person);  

6.資源

    大家可以從項目主頁:https://github.com/cemdervis/SharpConfig下面源代碼。親,

    我在這里提供一個下載,以及我使用的案例Demo例子。官方提供了一個Winform的圖形界面,非常直觀,這里截圖看看,如果大家要用,從我這里下載也可以。

    源碼下載:http://files.cnblogs.com/files/asxinyu/SharpConfig-master.rar

  編譯4.0dll下載:SharpConfig.rar

    Winform顯示配置文件的圖形界面

blob.png 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM