.NET程式組態檔操作(ini,cfg,config)

2022-06-29 15:01:22

在程式開發過程中,我們一般會用到組態檔來設定一些引數。常見的組態檔格式為 ini, xml, config等。

INI

.ini檔案,通常為初始化檔案,是用來儲存程式設定資訊的文字檔案。

[Login]
#開啟加密 0:不開啟、1:開啟
open_ssl_certificate=0

.NET 框架本身不支援 INI 檔案,可以利用 Windows API方法使用平臺呼叫服務來寫入和讀取檔案。

// 要寫入的部分名稱 - sectionName
// 要設定的鍵名 - key
// 要設定的值 - value
// INI檔案位置 - filepath
// 讀取是否成功 - result
[DllImport("kernel32")]
bool WritePrivateProfileString(string sectionName,string key,string value,string filepath);

// 要讀取的部分名稱 - sectionName
// 要讀取的鍵名 - key
// 如果鍵不存在返回的預設值 - default
// 接收用作緩衝區的字串 - ReturnedVal
// 實際讀取的值 - maxsize
// INI檔案位置 - filepath
[DllImport("kernel32")]
int GetPrivateProfileString(string sectionName,string key,string default,StringBuilder ReturnedVal,int maxsize,string filepath);

一般會封裝一個類來呼叫該API方法。

public class ReadWriteINIFile{
    ...
    public void WriteINI(string name, string key, string value)
    {
        WritePrivateProfileString(name, key, value, _path);
    }

    public string ReadINI(string name, string key)
    {
        StringBuilder sb = new StringBuilder(255);
        int ini = GetPrivateProfileString(name, key, "", sb, 255, _path);
        return sb.ToString();
    }
}

CFG

SharpConfig 是 .NET 的CFG/INI 組態檔操作元件,以文字或二進位制格式讀取,修改和儲存組態檔和流。

Configuration config = Configuration.LoadFromFile("login.cfg");
Section section = config["Login"];
// 讀取引數
bool isOpen = section["open_ssl_certificate"].GetValue<bool>();
// 修改引數
section["open_ssl_certificate"].Value = false;

Config

在 App.config/web.config 檔案中的 configSections 節點下設定 section 節點,.NET 提供自帶的型別進行封裝。
configSections節點必須為configuration下第一個節點

NameValue鍵值對

<?xml version="1.0" encoding="utf-8" ?>
<configuration>	
    <configSections>		
        <!--以NameValueCollection鍵值對的形式返回設定節點中的資訊,type值固定為System.Configuration.NameValueSectionHandler-->		
            <section name="NameValueConfigNode" type="System.Configuration.NameValueSectionHandler"/>	
    </configSections>	
    <!--自定義設定節點-->	
    <NameValueConfigNode>		
        <add key="Name一" value="Value一" />		
        <add key="Name二" value="Value二" />		
    </NameValueConfigNode>    
    <startup>         
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />    
    </startup>
</configuration>

定義一個靜態屬性的方法獲取 Dictionary 格式的資料:

/// <summary>
/// NameValueCollection
/// </summary>
public static Dictionary<string, string> NameValueConfigNode
{
    get
    {
        NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("NameValueConfigNode");
        Dictionary<string, string> result = new Dictionary<string,string>();
         foreach (string key in nvc.AllKeys)
        { 
            result.Add(key, nvc[key]);
        }
        return result;
    }
}

Dictionary

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<!--以Dictionary字典的形式返回設定節點中的資訊,type固定為System.Configuration.DictionarySectionHandler-->
		<section name="DictionaryConfigNode" type="System.Configuration.DictionarySectionHandler"/>
	</configSections>
	<!--自定義設定節點-->
	<DictionaryConfigNode>
		<add key="Key一" value="DictValue一" />
		<add key="Key二" value="DictValue二" />
	</DictionaryConfigNode>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
</configuration>
/// <summary>
/// Dictionary
/// </summary>
public static Dictionary<string, string> DictionaryConfigNode
{
    get
    {
        IDictionary dict = (IDictionary)ConfigurationManager.GetSection("DictionaryConfigNode");
        Dictionary<string, string> result = new Dictionary<string, string>();
        foreach (string key in dict.Keys)
        {
            result.Add(key, dict[key].ToString());
        }
        return result;
    }
}

SingTag

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<!--基礎結構處理 .config 檔案中由單個 XML 標記所表示的各設定節點中的值,type固定為System.Configuration.SingleTagSectionHandler-->
		<section name="SingleTagConfigNode" type="System.Configuration.SingleTagSectionHandler" />
	</configSections>
	<!--自定義設定節點-->
	<!--注意,只能是單個節SingleTagSectionHandler才能處理,無論有多少個屬性都能處理-->
	<SingleTagConfigNode PropertyOne="1" PropertyTwo="2" PropertyThree="3" PropertyFour="4" PropertyFive="5" />
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
</configuration>
/// <summary>
/// SingleTag
/// </summary>
public static Dictionary<string, string> SingleTagConfigNode
{
    get
    {
        Hashtable dict = (Hashtable)ConfigurationManager.GetSection("SingleTagConfigNode");
        Dictionary<string, string> result = new Dictionary<string, string>();
        foreach (string key in dict.Keys)
        {
            result.Add(key, dict[key].ToString());
        }
        return result;
    }
}

自定義組態檔

如果組態檔很多,可以單獨定義組態檔,然後在 App.config/Web.config 檔案中宣告。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<!--把MyConfigData1節點的資料對映到MyConfigData類中-->
		<section name="MyConfigData1" type="ConsoleApplication.ConfigFiles.ConfigFile,ConsoleApplication"/>
	</configSections>
	<!--自定義設定節點,configSource指定自定義組態檔的路徑(必須是相對路徑)-->
	<MyConfigData configSource="ConfigFiles\MyConfigFile.config"/>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
</configuration>

自定義檔案 MyConfigFile.config 內容:

<?xml version="1.0" encoding="utf-8" ?>
<MyConfigData>
	<add key="Key一" value="自定義檔案一" />
	<add key="Key二" value="自定義檔案二" />
	<add key="Key三" value="自定義檔案三" />
</MyConfigData>

XML

XML檔案常用於簡化資料的儲存和共用,它的設計宗旨是傳輸資料,而非顯示資料。對於複雜不規則的設定資訊也可以用XML檔案進行儲存。

// 讀取檔案
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("myfile.xml");
// 根節點
var nodeRoot = xmlDoc.DocumentElement;
// 建立新節點
XmlElement studentNode = xmlDoc.CreateElement("student");
// 建立新節點的孩子節點
XmlElement nameNode = xmlDoc.CreateElement("name");
// 建立父子關係
studentNode.AppendChild(nameNode);
nodeRoot.AppendChild(studentNode);

XML基礎教學:https://www.w3school.com.cn/xml/index.asp

我的公眾號