生活随笔
收集整理的這篇文章主要介紹了
ini文件操作类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?INI文件其實是一種具有特定結構的文本文件,它的構成分為三部分,文件由若干個段落(section)組成,每個段落又分成若干個鍵(key)和值(value),結構如下:
[Section1]
key?1?=?value2
key?1?=?value2
……
[Section2]
key?1?=?value1
key?2?=?value2
……
/// <summary> /// ini文件幫助類/// </summary> public class IniUtil{#region/// <summary>/// 獲取所有段落名稱/// </summary>/// <param name="lpszReturnBuffer">接受數據內存緩沖區指針</param>/// <param name="nSize">數據內存緩沖區最大大小</param>/// <param name="lpFileName">ini文件的路徑</param>/// <returns></returns>
[SuppressUnmanagedCodeSecurity][DllImport("kernel32.dll", CharSet =
CharSet.Auto)]public static extern int GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer,
uint nSize,
string lpFileName);/// <summary>/// 獲取值(String)/// </summary>/// <param name="lpAppName">段落名稱</param>/// <param name="lpKeyName">鍵名稱</param>/// <param name="lpDefault">找不到時返回的值</param>/// <param name="lpReturnedString">接受數據字符串</param>/// <param name="nSize">數據內存緩沖區最大大小</param>/// <param name="lpFileName">ini文件的路徑</param>/// <returns></returns>
[SuppressUnmanagedCodeSecurity][DllImport("kernel32.dll", CharSet =
CharSet.Auto)]public static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault, StringBuilder lpReturnedString,
int nSize,
string lpFileName);/// <summary>/// 獲取值(char[])/// </summary>/// <param name="lpAppName">段落名稱</param>/// <param name="lpKeyName">鍵名稱</param>/// <param name="lpDefault">找不到時返回的值</param>/// <param name="lpReturnedString">接受數據字符串</param>/// <param name="nSize">數據內存緩沖區最大大小</param>/// <param name="lpFileName">ini文件的路徑</param>/// <returns></returns>
[SuppressUnmanagedCodeSecurity][DllImport("kernel32.dll", CharSet =
CharSet.Auto)]public static extern uint GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault, [In, Out]
char[] lpReturnedString,
int nSize,
string lpFileName);/// <summary>/// 獲取值(IntPtr)/// </summary>/// <param name="lpAppName">段落名稱</param>/// <param name="lpKeyName">鍵名稱</param>/// <param name="lpDefault">找不到時返回的值</param>/// <param name="lpReturnedString">接受數據字符串指針</param>/// <param name="nSize">數據內存緩沖區最大大小</param>/// <param name="lpFileName">ini文件的路徑</param>/// <returns></returns>
[SuppressUnmanagedCodeSecurity][DllImport("kernel32.dll", CharSet =
CharSet.Auto)]public static extern int GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault, IntPtr lpReturnedString,
uint nSize,
string lpFileName);/// <summary>/// 獲取值(Int)/// </summary>/// <param name="lpAppName">段落名稱</param>/// <param name="lpKeyName">鍵名稱</param>/// <param name="lpDefault">找不到時返回的值</param>/// <param name="lpFileName">ini文件的路徑</param>/// <returns></returns>
[SuppressUnmanagedCodeSecurity][DllImport("kernel32.dll", CharSet =
CharSet.Auto)]public static extern int GetPrivateProfileInt(
string lpAppName,
string lpKeyName,
int lpDefault,
string lpFileName);/// <summary>/// 獲取指定段落/// </summary>/// <param name="lpAppName">段落名稱</param>/// <param name="lpReturnedString">接受數據字符串指針</param>/// <param name="nSize">數據內存緩沖區最大大小</param>/// <param name="lpFileName">ini文件的路徑</param>/// <returns></returns>
[SuppressUnmanagedCodeSecurity][DllImport("kernel32.dll", CharSet =
CharSet.Auto)]public static extern int GetPrivateProfileSection(
string lpAppName, IntPtr lpReturnedString,
uint nSize,
string lpFileName);/// <summary>/// 獲取值(String)(WritePrivateProfileString通過SetLastError返回錯誤)/// </summary>/// <param name="lpAppName">段落名稱</param>/// <param name="lpKeyName">鍵名稱</param>/// <param name="lpString">鍵對應值</param>/// <param name="lpFileName">ini文件的路徑</param>/// <returns></returns>[DllImport(
"kernel32.dll", CharSet = CharSet.Auto, SetLastError =
true)]public static extern bool WritePrivateProfileString(
string lpAppName,
string lpKeyName,
string lpString,
string lpFileName);#endregionprivate const int MaxSectionSize =
32767;
// ini文件中一個段落(section)的最大大小。此屬性定義緩沖區的最大大小,用于從ini文件中檢索數據。這個值是win32函數GetPrivateProfileSectionNames()或GetPrivateProfileString ()允許的最大值。private string _path;
//ini文件的路徑/// <summary>/// ini文件的物理路徑/// </summary>public string Path{get{return this._path;}}/// <summary>/// /// </summary>/// <param name="path">ini文件的相對路徑</param>public IniUtil(
string path){this._path =
System.IO.Path.GetFullPath(path);}/// <summary>/// 獲取指定段落指定鍵的值/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="defaultValue">找不到時返回的值</param>/// <returns></returns>public string GetString(
string sectionName,
string keyName,
string defaultValue){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");if (keyName ==
null)throw new ArgumentNullException(
"keyName");StringBuilder result =
new StringBuilder(MaxSectionSize);GetPrivateProfileString(sectionName, keyName, defaultValue, result, MaxSectionSize, _path);return result.ToString();}/// <summary>/// 獲取指定段落指定鍵的值/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="defaultValue">找不到時返回的值</param>/// <returns></returns>public int GetInt16(
string sectionName,
string keyName,
short defaultValue){int retval =
this.GetInt32(sectionName, keyName, defaultValue);return Convert.ToInt16(retval);}/// <summary>/// 獲取指定段落指定鍵的值/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="defaultValue">找不到時返回的值</param>/// <returns></returns>public int GetInt32(
string sectionName,
string keyName,
int defaultValue){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");if (keyName ==
null)throw new ArgumentNullException(
"keyName");return GetPrivateProfileInt(sectionName, keyName, defaultValue, _path);}/// <summary>/// 獲取指定段落指定鍵的值/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="defaultValue">找不到時返回的值</param>/// <returns></returns>public double GetDouble(
string sectionName,
string keyName,
double defaultValue){string retval =
this.GetString(sectionName, keyName,
"");if (retval ==
null || retval.Length ==
0){return defaultValue;}return Convert.ToDouble(retval, CultureInfo.InvariantCulture);}/// <summary>/// 獲取指定段落的所有鍵值對/// </summary>/// <param name="sectionName">段落名稱</param>/// <returns></returns>public List<KeyValuePair<
string,
string>> GetSectionValuesAsList(
string sectionName){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");List<KeyValuePair<
string,
string>>
result;string[] keyValuePairs;string key, value;int equalSignPos;IntPtr ptr =
Marshal.AllocCoTaskMem(MaxSectionSize);try{int len =
GetPrivateProfileSection(sectionName, ptr, MaxSectionSize, _path);keyValuePairs =
ConvertNullSeperatedStringToStringArray(ptr, len);}finally{Marshal.FreeCoTaskMem(ptr);}result =
new List<KeyValuePair<
string,
string>>
(keyValuePairs.Length);for (
int i =
0; i < keyValuePairs.Length; ++
i){equalSignPos = keyValuePairs[i].IndexOf(
'=');key = keyValuePairs[i].Substring(
0, equalSignPos);value = keyValuePairs[i].Substring(equalSignPos +
1, keyValuePairs[i].Length - equalSignPos -
1);result.Add(new KeyValuePair<
string,
string>
(key, value));}return result;}/// <summary>/// 獲取指定段落的所有鍵值對/// </summary>/// <param name="sectionName">段落名稱</param>/// <returns></returns>public Dictionary<
string,
string> GetSectionValues(
string sectionName){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");Dictionary<
string,
string>
result;List<KeyValuePair<
string,
string>>
keyValuePairs;keyValuePairs =
this.GetSectionValuesAsList(sectionName);result =
new Dictionary<
string,
string>
(keyValuePairs.Count);foreach (KeyValuePair<
string,
string> keyValuePair
in keyValuePairs){if (!
result.ContainsKey(keyValuePair.Key)){result.Add(keyValuePair.Key, keyValuePair.Value);}}return result;}/// <summary>/// 獲取指定段落的所有鍵名稱/// </summary>/// <param name="sectionName">段落名稱</param>/// <returns></returns>public string[] GetKeyNames(
string sectionName){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");string[] result;int len;IntPtr ptr =
Marshal.AllocCoTaskMem(MaxSectionSize);try{len = GetPrivateProfileString(sectionName,
null,
null, ptr, MaxSectionSize, _path);result =
ConvertNullSeperatedStringToStringArray(ptr, len);}finally{Marshal.FreeCoTaskMem(ptr);}return result;}/// <summary>/// 獲取所有段落名稱/// </summary>/// <returns></returns>public string[] GetSectionNames(){string[] result;int len;IntPtr ptr =
Marshal.AllocCoTaskMem(MaxSectionSize);try{len =
GetPrivateProfileSectionNames(ptr, MaxSectionSize, _path);result =
ConvertNullSeperatedStringToStringArray(ptr, len);}finally{Marshal.FreeCoTaskMem(ptr);}return result;}/// <summary>/// 指針數據轉換為字符串數組/// </summary>/// <param name="ptr">指向字符串數據的指針</param>/// <param name="valLength">指向指針的數據的長度</param>/// <returns></returns>private static string[] ConvertNullSeperatedStringToStringArray(IntPtr ptr,
int valLength){string[] result;if (valLength ==
0){result =
new string[
0];}else{string buff = Marshal.PtrToStringAuto(ptr, valLength -
1);
//將緩沖區轉換為字符串。長度減少1,這樣我們就把第二個空移走了。result = buff.Split(
'\0');}return result;}/// <summary>/// 寫入鍵值到指定段落/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="value">值</param> private void WriteValueInternal(
string sectionName,
string keyName,
string value){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");if (keyName ==
null)throw new ArgumentNullException(
"keyName");if (value ==
null)throw new ArgumentNullException(
"value");if (!
WritePrivateProfileString(sectionName, keyName, value, _path)){throw new System.ComponentModel.Win32Exception();}}/// <summary>/// 寫入鍵值到指定段落/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="value">值</param>public void WriteValue(
string sectionName,
string keyName,
string value){this.WriteValueInternal(sectionName, keyName, value);}/// <summary>/// 寫入鍵值到指定段落/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="value">值</param>public void WriteValue(
string sectionName,
string keyName,
short value){this.WriteValue(sectionName, keyName, (
int)value);}/// <summary>/// 寫入鍵值到指定段落/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="value">值</param>public void WriteValue(
string sectionName,
string keyName,
int value){this.WriteValue(sectionName, keyName, value.ToString(CultureInfo.InvariantCulture));}/// <summary>/// 寫入鍵值到指定段落/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="value">值</param>public void WriteValue(
string sectionName,
string keyName,
float value){this.WriteValue(sectionName, keyName, value.ToString(CultureInfo.InvariantCulture));}/// <summary>///寫入鍵值到指定段落 /// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>/// <param name="value">值</param>public void WriteValue(
string sectionName,
string keyName,
double value){this.WriteValue(sectionName, keyName, value.ToString(CultureInfo.InvariantCulture));}/// <summary>/// 刪除指定段落的鍵/// </summary>/// <param name="sectionName">段落名稱</param>/// <param name="keyName">鍵名稱</param>public void DeleteKey(
string sectionName,
string keyName){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");if (keyName ==
null)throw new ArgumentNullException(
"keyName");this.WriteValueInternal(sectionName, keyName,
null);}/// <summary>/// 刪除指定段落/// </summary>/// <param name="sectionName">段落名稱</param>public void DeleteSection(
string sectionName){if (sectionName ==
null)throw new ArgumentNullException(
"sectionName");this.WriteValueInternal(sectionName,
null,
null);}} ?
轉載于:https://www.cnblogs.com/tlmbem/p/11280179.html
總結
以上是生活随笔為你收集整理的ini文件操作类的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。