C#讀寫INI配置文件

afm_dw 8年前發布 | 2K 次閱讀 C# c# ini Windows

INI文件就是擴展名為“ini”的文件。在Windows系統中,INI文件是很多,最重要的就是“System.ini”、“System32.ini”和“Win.ini”。該文件主要存放用戶所做的選擇以及系統的各種參數。用戶可以通過修改INI文件,來改變應用程序和系統的很多配置。但自從Windows 95的退出,在Windows系統中引入了注冊表的概念,INI文件在Windows系統的地位就開始不斷下滑,這是因為注冊表的獨特優點,使應用程序和系統都把許多參數和初始化信息放進了注冊表中。但在某些場合,INI文件還擁有其不可替代的地位。本文就來探討一下C#是如何對INI進行讀寫操作。

INI文件的結構

INI文件是一種按照特點方式排列的文本文件。每一個INI文件構成都非常類似,由若干段落(section)組成,在每個帶括號的標題下面,是若干個以單個單詞開頭的關鍵詞(keyword)和一個等號,等號右邊的就是關鍵字對應的值(value)。其一般形式如下:

[Section1]
KeyWord1 = Valuel
KeyWord2 = Value2
 ……
[Section2]
KeyWord3 = Value3
KeyWord4 = Value4

C#和Win32 API函數

C#并不像C++,擁有屬于自己的類庫。C#使用的類庫是.Net框架為所有.Net程序開發提供的一個共有的類庫——.Net FrameWork SDK。雖然.Net FrameWork SDK內容十分龐大,功能也非常強大,但還不能面面俱到,至少它并沒有提供直接操作INI文件所需要的相關的類。在本文中,C#操作INI文件使用的是Windows系統自帶Win32的API函數——WritePrivateProfileString()和GetPrivateProfileString()函數。這二個函數都位于“kernel32.dll”文件中。

我們知道在C#中使用的類庫都是托管代碼(Managed Code)文件,而Win32的API函數所處的文件,都是非托管代碼(Unmanaged Code)文件。這就導致了在C#中不可能直接使用這些非托管代碼文件中的函數。好在.Net框架為了保持對下的兼容,也為了充分利用以前的資源,提出了互操作,通過互操作可以實現對Win32的API函數的調用。互操作不僅適用于Win32的API函數,還可以用來訪問托管的COM對象。C#中對Win32的API函數的互操作是通過命名空間“System.Runtime.InteropServices”中的“DllImport”特征類來實現的。它的主要作用是指示此屬性化方法是作為非托管DLL的輸出實現的。下面代碼就是在C#利用命名空間“System.Runtime.InteropServices”中的“DllImport”特征類申明上面二個Win32的API函數:

C#申明INI文件的寫操作函數WritePrivateProfileString():

[DllImport("kernel32")]
private static extern long WritePrivateProfileString ( string
  section ,
  string key , string val , string filePath ) ;

參數說明:

  • section:INI文件中的段落;
  • key:INI文件中的關鍵字;
  • val:INI文件中關鍵字的數值;
  • filePath:INI文件的完整的路徑和名稱。

C#申明INI文件的讀操作函數GetPrivateProfileString():

[DllImport ( "kernel32" )]
private static extern int GetPrivateProfileString ( string section ,
  string key , string def , StringBuilder retVal ,
  int size , string filePath ) ;

參數說明:

  • section:INI文件中的段落名稱;
  • key:INI文件中的關鍵字;
  • def:無法讀取時候時候的缺省數值;
  • retVal:讀取數值;
  • size:數值的大小;
  • filePath:INI文件的完整路徑和名稱。

下面是一個讀寫INI文件的類

public class INIClass
{
  public string inipath;
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);
  /// <summary>
  /// 構造方法
  /// </summary>
  /// <param name="INIPath">文件路徑</param>
  public INIClass(string INIPath)
  {
    inipath = INIPath;
  }
  /// <summary>
  /// 寫入INI文件
  /// </summary>
  /// <param name="Section">項目名稱(如 [TypeName] )</param>
  /// <param name="Key">鍵</param>
  /// <param name="Value">值</param>
  public void IniWriteValue(string Section,string Key,string Value)
  {
    WritePrivateProfileString(Section,Key,Value,this.inipath);
  }
  /// <summary>
  /// 讀出INI文件
  /// </summary>
  /// <param name="Section">項目名稱(如 [TypeName] )</param>
  /// <param name="Key">鍵</param>
  public string IniReadValue(string Section,string Key)
  {
    StringBuilder temp = new StringBuilder(500);
    int i = GetPrivateProfileString(Section,Key,"",temp,500,this.inipath);
    return temp.ToString();
  }
  /// <summary>
  /// 驗證文件是否存在
  /// </summary>
  /// <returns>布爾值</returns>
  public bool ExistINIFile()
  {
    return File.Exists(inipath);
  }
}
 本文由用戶 afm_dw 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!