C# winform中讀寫ini檔案

世紀緣發表於2016-11-30

INI檔案是一種具有特定結構的文字檔案,它的構成分為三部分,結構如下:

[Section1]
key 
1 = value2
key 
1 = value2
……
[Section2]
key 
1 = value1
key 
2 = value2
……


檔案由若干個段落(section)組成,每個段落又分成若干個鍵(key)和值(value)。Windows系統自帶的Win32的API函式GetPrivateProfileString()和WritePrivateProfileString()分別實現了對INI檔案的讀寫操作,他們位於kernel32.dll下。

但是令人遺憾的是C#所使用的.NET框架下的公共類庫並沒有提供直接操作INI檔案的類,所以唯一比較理想的方法就是呼叫API函式。

然後,.Net框架下的類庫是基於託管程式碼的,而API函式是基於非託管程式碼的,(在執行庫的控制下執行的程式碼稱作託管程式碼。相反,在執行庫之外執行的程式碼稱作非託管程式碼。)如何實現託管程式碼與非託管程式碼之間的操作呢?.Net框架的System.Runtime.InteropServices名稱空間下提供各種各樣支援COM interop及平臺呼叫服務的成員,其中最重要的屬性之一DllImportAttribute可以用來定義用於訪問非託管API的平臺呼叫方法,它提供了對從非託管DLL匯出的函式進行呼叫所必需的資訊。下面就來看一下如何實現C#與API函式的互操作。

讀操作:

[csharp] view plain copy
  1. [DllImport("kernel32")]  
  2. private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath);   
  3. section:要讀取的段落名  
  4. key: 要讀取的鍵  
  5. defVal: 讀取異常的情況下的預設值  
  6. retVal: key所對應的值,如果該key不存在則返回空值  
  7. size: 值允許的大小  
  8. filePath: INI檔案的完整路徑和檔名  
寫操作:

[csharp] view plain copy
  1. [DllImport("kernel32")]   
  2. private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);   
  3. section: 要寫入的段落名  
  4. key: 要寫入的鍵,如果該key存在則覆蓋寫入  
  5. val: key所對應的值  
  6. filePath: INI檔案的完整路徑和檔名  
這樣,在就可以使用對他們的呼叫,用常規的方式定義一個名為IniFile類:

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Runtime.InteropServices;  
  6. using System.IO;  
  7.   
  8. namespace 測試  
  9. {  
  10.     /// <summary>  
  11.     /// INI檔案的操作類  
  12.     /// </summary>  
  13.     public class IniFile  
  14.     {  
  15.         public string Path;  
  16.   
  17.         public IniFile(string path)  
  18.         {  
  19.             this.Path = path;  
  20.         }  
  21.  
  22.         #region 宣告讀寫INI檔案的API函式  
  23.   
  24.         [DllImport("kernel32")]  
  25.         private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);  
  26.   
  27.         [DllImport("kernel32")]  
  28.         private static extern int GetPrivateProfileString(string section, string key, string defVal, StringBuilder retVal, int size, string filePath);  
  29.   
  30.         [DllImport("kernel32")]  
  31.         private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);  
  32.  
  33.         #endregion  
  34.   
  35.         /// <summary>  
  36.         /// 寫INI檔案  
  37.         /// </summary>  
  38.         /// <param name="section">段落</param>  
  39.         /// <param name="key">鍵</param>  
  40.         /// <param name="iValue">值</param>  
  41.         public void IniWriteValue(string section, string key, string iValue)  
  42.         {  
  43.             WritePrivateProfileString(section, key, iValue, this.Path);  
  44.         }  
  45.   
  46.         /// <summary>  
  47.         /// 讀取INI檔案  
  48.         /// </summary>  
  49.         /// <param name="section">段落</param>  
  50.         /// <param name="key">鍵</param>  
  51.         /// <returns>返回的鍵值</returns>  
  52.         public string IniReadValue(string section, string key)  
  53.         {  
  54.             StringBuilder temp = new StringBuilder(255);  
  55.   
  56.             int i = GetPrivateProfileString(section, key, "", temp, 255, this.Path);  
  57.             return temp.ToString();  
  58.         }  
  59.   
  60.         /// <summary>  
  61.         /// 讀取INI檔案  
  62.         /// </summary>  
  63.         /// <param name="Section">段,格式[]</param>  
  64.         /// <param name="Key">鍵</param>  
  65.         /// <returns>返回byte型別的section組或鍵值組</returns>  
  66.         public byte[] IniReadValues(string section, string key)  
  67.         {  
  68.             byte[] temp = new byte[255];  
  69.   
  70.             int i = GetPrivateProfileString(section, key, "", temp, 255, this.Path);  
  71.             return temp;  
  72.         }  
  73.     }  
  74. }  

程式在呼叫IniFile類時需要先例項化

[csharp] view plain copy
  1. string path = Environment.CurrentDirectory + @"\Config.ini";  //指定ini檔案的路徑  
  2. IniFile ini = new IniFile(path);  
  3. string FpOrderNumber = ini.IniReadValue("SQL""FpOrderNumber");//讀取ini檔案中鍵<span style="font-family: Arial, Helvetica, sans-serif;">FpOrderNumber的值</span><pre name="code" class="csharp" style="font-size: 13px; line-height: 19px;">ini.IniWriteValue("SQL", "FpOrderNumber", tsslMo.Text);//將tsslMo.Text的值寫到鍵FpOrderNumber中去  




相關文章