1. 程式人生 > >.NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件

.NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件

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

1.SharpConfig簡介

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

    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.資源

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

    Winform顯示配置檔案的圖形介面

blob.png

相關推薦

.NET平臺開源專案(1)SharpConfig配置檔案元件

在.NET平臺日常開發中,讀取配置檔案是一個很常見的需求。以前都是使用System.Configuration.ConfigurationSettings來操作,這個說實話,搞起來比較費勁。不知道大家有沒有同感。所以更多時候我還是喜歡使用開源的東西,更加方便簡潔,也穩定。省去自己的麻煩。今天就介紹一個非常精緻

.NET平臺開源專案(14)最快的物件對映元件Tiny Mapper

    好久沒有寫文章,工作甚忙,但每日還是關注.NET領域的開源專案。五一休息,放鬆了一下之後,今天就給大家介紹一個輕量級的物件對映工具Tiny Mapper:號稱是.NET平臺最快的物件對映元件。那就一起看看呢。 臨時更新:感謝@ 的意見,為了避免新手誤解,這裡說明一下,Tiny Mappe

.NET平臺開源專案(11)KwCombinatorics排列組合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重點介紹了KwCombinatorics元件的使用情況,其實這個元件我5年前就開始用了,非常方便,麻雀雖小五臟俱全。所以一直非常喜歡,才寫了幾篇文章推薦給大家。最近在計算足球彩票結果組合過程中,使用的到了其功能,生成排列,非常具有代表性,而且也

.NET平臺開源專案(5)深入使用與擴充套件SharpConfig元件

  上個月在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧  和 .NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件 中都提到了SharpConfig元件,簡單輕量級,速度快,而且還有比較深入的使用介紹。在文章釋出後,也有網友提到一些問題,當時我也沒仔細去分析,在這次我親

.NET平臺開源專案-最快的物件對映元件Tiny Mapper之專案實踐

心情小札:近期換了工作,苦逼於22:00後下班,房間一篇狼藉~ 小翠鄙視到:"你就適合生活在垃圾堆中!!!" 看評論也是挺有價值,同時也看到許多新手同學問道在實際專案中使用的情況。 下面就原作者的程式碼的基礎上略作調整,闡述一下在實際專案場景中的使用: 第一步:瞭解類庫方法:TinyMapper 主

.NET平臺開源專案(20)Newlife.Core中簡單靈活的配置檔案

如果用知乎,可以關注專欄: 記得5年前開始拼命翻讀X元件的原始碼,特別是XCode,但對Newlife.Core 的東西瞭解很少,最多隻是會用用,而且用到的只是九牛一毛。裡面好用的東西太多了。 最近一年時間,零零散散又學了很多,也瞭解了很多,不會寫那總要學會用吧,今天就給大家介紹裡面非常好用的自定義配置檔

.NET平臺開源專案(19)Power BI神器DAX Studio

  PowerBI更新頻繁,已經有點更不上的節奏,一直在關注和學習中,基本的一些操作大概是沒問題,更重要的是注重Power Query,M函式,以及DAX的使用,這才是核心。     上個月研究了DAX的一些語法和公式,發現這玩意看起來簡單,但其實功能非常強大,所以就想和寫程式碼一樣,弄個工具試一下。

.NET平臺開源專案(21)Cron任務排程CronNET

Quartznet大名鼎鼎應該很少有人不知道,相關的開源專案很多,不過那東東對新手來說,有點晦澀,加上哪個Cron表示式,可能一進去雲裡霧裡的。今天給大家介紹一個簡單的在.NET平臺上執行Cron計劃任務的元件CronNET。同時也給大家推介幾個Cron表示式的工具。 1.Cron介紹和工具

.NET平臺開源專案(7)關於NoSQL資料庫LiteDB的分頁查詢解決過程

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯) 與 .NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB中,介紹了LiteDB的基本使用情況以及部分技術細節,我還沒有在實際系統中大量使用,但文章釋出後,有不少網友( )反應在實際專案中使用過,效果還

.NET平臺開源專案(3)小巧輕量級NoSQL檔案資料庫LiteDB

    今天給大家介紹一個不錯的小巧輕量級的NoSQL檔案資料庫LiteDB。本部落格在2013年也介紹過2款.NET平臺的開源資料庫:     上面2個數據庫我的實際的專案中用過,還不錯。當然資料量很小,主要是客戶比較變態,必須要用xml檔案儲存,就想到了,另外NDatabase只是自己覺得好玩,

.NET平臺開源專案(9)軟體序列號生成元件SoftwareProtector介紹與使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Software Protector序列號生成元件。今天就通過一篇簡單的文章來預覽一下其強大的功能。雖然我人為其已經基本滿足了一個軟體序列號的所有要素,但至於大家用不用得上,還得看大家的需求。總的來

.NET平臺開源專案(10)FluentValidation驗證元件深入使用(二)

    在上一篇文章:.NET平臺開源專案速覽(6)FluentValidation驗證元件介紹與入門(一) 中,給大家初步介紹了一下FluentValidation驗證元件的使用情況。文章從構建間的驗證器開始,到最後的結果,以及複雜驗證等都做了比較深入的講解和使用。但其實一個完整的元件是麻雀雖小五臟俱全

.NET平臺開源專案(2)Compare .NET Objects物件比較元件

    .NET平臺開源專案速覽今天介紹一款小巧強大的物件比較元件。可以更詳細的獲取2個物件的差別,並記錄具體差別,比較過程和要求可以靈活配置。 1.Compare .NET Objects介紹     Compare .NET Objects元件是.NET平臺用於深入比較2個.NET物件的開源元

.NET平臺開源專案(13)機器學習元件Accord.NET框架功能介紹

    Accord.NET Framework是在AForge.NET專案的基礎上封裝和進一步開發而來。因為AForge.NET更注重與一些底層和廣度,而Accord.NET Framework更注重與機器學習演算法以及提供計算機視訊、音訊、訊號處理以及統計應用相關的解決方案。該專案使用C#語言編寫,專

.NET平臺開源專案(8)Expression Evaluator表示式計算元件使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Expression Evaluator驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天就通過一篇簡單的文章來預覽一下其強大的功能。本文曾在【原創】.NET開源表示式計算元

.NET平臺開源專案(4).NET文件生成工具ADB及使用

    很久以前就使用ADB這個工具來生成專案的幫助文件。功能強大,在學習一些開源專案的過程中,官方沒有提供CHM幫助文件,所以為了快速的瞭解專案結構和註釋。就生成文件來自己看,非常好用。這也是一個學習方法吧。例如本文在:   上述2篇文章中最後的資源中就手動製作了CHM幫助文件。有時候我們還可

.NET平臺開源專案(6)FluentValidation驗證元件介紹與入門(一)

    在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下FluentValidation驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天以及接下去的幾篇文章就專門介紹這個元件。不僅僅是它小,輕量級,優雅,而且一直在持續更新中

.NET平臺開源專案(12)雜湊演算法集合類庫HashLib

    .NET的System.Security.Cryptography名稱空間本身是提供加密服務,雜湊函式,對稱與非對稱加密演算法等功能。實際上,大部分情況下已經滿足了需求,而且.NET實現的都是目前國際上比較權威的,標準化的演算法,所以還是安全可靠的。但也有一些場合,需要自己實現一些安全雜湊演算法。

.NET平臺開源專案(18)C#平臺JSON實體類生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析複雜字串,json一定要用JsonMapper麼?中介紹了簡單的JSON解析的問題,那種方法在當時的環境是非常方便的,因為不需要生成實體類,結構很容易解析。但隨著業務的變化,也會碰到超級變態的JSON,如果還按照以前的思路,會把人搞抽風掉,一旦結構變化,又要重來。所

.NET平臺開源專案(16)C#PDF檔案類庫PDF File Writer介紹

    1年前,我在文章:這些.NET開源專案你知道嗎?.NET平臺開源文件與報表處理元件集合(三)中(第9個專案),給大家推薦了一個開源免費的PDF讀寫元件 PDFSharp,PDFSharp我2年前就看過,用過簡單的例子,不過程式碼沒有寫成專門的文章。最近在查詢資料的時候,又發現一款小巧的寫PDF檔案