Getvalue, Setvalue INI file với C#.

INI file là gì ?

Định dạng INI (files với đuôi .ini) là một loại tệp chứa thông tin cấu hình ở định dạng đơn giản plain-text (văn bản minh bạch, rõ ràng), được xác định trước. Nó được sử dụng bởi hệ điều hành Windows và các ứng dụng dựa trên Windows để lưu trữ thông tin về cấu hình và môi trường hoạt động của người dùng. Các tệp này là tệp văn bản thuần túy với cấu trúc cơ bản bao gồm các section và key.

INI format ?

Cấu trúc của ini file bao gồm phần Section, KeyValue

Ví dụ:

[Carrier]
Name=Singtel
CountryId=88

[CallCategories]
N=National
I=International
M=CoinCard
L=Local

Trong file ini bên trên thì

  • [Carrier] là section.
  • Name, CountryId là key của section [Carrier] .
  • Các giá trị Singtel, 88 là value của key tương ứng.

Get, Set value INI file ?

Class IniUtil đảm nhiệm chức năng Get và Set giá trị trong ini file

Function GetValue(string section, string key, string ifMissing) sẽ lấy value của key tương ứng trong ini file, nếu không tìm được value của key tương ứng thì sẽ trả về giá trị mặc định

  • param section : tên của section trong ini file
  • param key: tên của key trong ini file
  • param ifMissing: value mặc định nếu không tìm được giá trị của key tương ứng

Function SetValue(string section, string key, string keyvalue) sẽ set value cho key tương ứng.

  • param section : tên của section trong ini file
  • param key: tên của key trong ini file
  • param keyvalue: chính là value cần set

// class IniUtil

public class IniUtil
{
	[DllImport("kernel32.dll")]
	private static extern int GetPrivateProfileSectionNames(byte[] lpszReturnBuffer, int nSize, string lpFileName);
	[DllImport("kernel32.dll")]
	private static extern int GetPrivateProfileSection(string lpAppName, byte[] lpReturnedString, int nSize, string lpFileName);
	[DllImport("kernel32.dll")]
	private static extern int GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, byte[] lpReturnedString, int nSize, string lpFileName);
	[DllImport("kernel32.dll")]
	private static extern bool WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName);

	private const int VALUE_BUFFER = 511;
	private const int SECTION_BUFFER = (1024 * 16);
	private string m_sIniFile;

	/// <summary>
	/// .ctor with INI file name
	/// </summary>
	/// <param name="fileName">Fullpath to the INI file</param>
	public IniUtil(string fileName)
	{
		m_sIniFile = fileName;
	}

	/// <summary>
	/// Set the value for a specific key in a section
	/// </summary>
	/// <param name="section">Section containing the key to write to</param>
	/// <param name="key">Key to insert/update</param>
	/// <param name="keyvalue">Value for the key</param>
	/// <returns>True if OK</returns>
	public bool SetValue(string section, string key, string keyvalue)
	{
		return WritePrivateProfileString(section, key, keyvalue, m_sIniFile);
	}

	/// <summary>
	/// Gets the value of the specidied key in the specified section, 
	/// If the key doesn't exists returns the default value
	/// </summary>
	/// <param name="section">Section containing the key to read from</param>
	/// <param name="key">Required key</param>
	/// <param name="ifMissing">Value to return in case the key is missing</param>
	/// <returns>string value of the key or missing value</returns>
	public string GetValue(string section, string key, string ifMissing)
	{
		byte[] by = new byte[VALUE_BUFFER];
		int n = GetPrivateProfileString(section, key, ifMissing, by, VALUE_BUFFER, m_sIniFile);
		string s = Encoding.ASCII.GetString(by);
		return s.Substring(0, n);
	}

	/// <summary>
	/// Returns the NameValueCollection for every key in the section
	/// </summary>
	/// <param name="section">Section name</param>
	/// <returns>NameValueCollection with nake=Key and value=value</returns>
	public NameValueCollection GetSectionKeysvalues(string section)
	{
		NameValueCollection n = new NameValueCollection();
		if (section.Length > 0)
		{
			byte[] by = new byte[SECTION_BUFFER];
			int x = GetPrivateProfileSection(section, by, SECTION_BUFFER, m_sIniFile);
			if (x > 0) x--;
			string keysvalues = Encoding.ASCII.GetString(by, 0, x);
			string[] temp = keysvalues.Split('\0');
			foreach (string s in temp)
			{
				string[] t = s.Split('=');
				n.Add(t[0], t[1]);
			}
		}
		return n;
	}

	/// <summary>
	/// Get the names of all sections in .INI
	/// </summary>
	/// <returns>string array with all the key names</returns>
	public string[] GetSectionNames()
	{
		byte[] by = new byte[SECTION_BUFFER];
		int x = GetPrivateProfileSectionNames(by, SECTION_BUFFER, m_sIniFile);
		if (x > 0) x--;
		string keys = Encoding.ASCII.GetString(by, 0, x);
		return keys.Split('\0');
	}
}

Cách dùng ?

// Khởi tạo ini file 
IniUtil ini = new IniUtil(@"C:\seting.ini");

// Get value
string Country = ini.GetValue("Carrier", "Country", "null"); // get value của key Country trong section Carrier nếu không get được giá trị sẽ trả về "null"

// Set value
ini.SetValue("CallCategories", "M", "Mobie"); // set value "Mobie" cho key M trong section CallCategories

Tổng kết

Vậy là chúng ta đã sơ lược, khái quát về định nghĩa , định dạng và cách sử dụng ini file.


All Rights Reserved