程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 怎麼樣在C#中讀寫INI文件

怎麼樣在C#中讀寫INI文件

編輯:C#基礎知識

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


本文中介紹的程序設計及運行環境:

● 微軟視窗2000 高級服務器版

● .Net Framework SDK正式版

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文件的完整路徑和名稱。

C#中讀寫INI文件的關鍵步驟和解決方法


C#對INI文件進行寫操作:

對INI文件進行寫操作,是通過組件button2的"Click"事件來實現的。這裡有一點應該注意,當在調用WritePrivateProfileString()對INI文件進行寫操作的時候,如果此時在INI文件中存在和要寫入的信息相同的段落名稱和關鍵字,則將覆蓋此INI信息。下面是button2組件的"Click"事件對應的代碼清單:

private void button2_Click ( object sender , System.EventArgs e ) 



	{



	string FileName = textBox1.Text ;



	string section = textBox2.Text ;



	string key = textBox3.Text ;



	string keyValue = textBox4.Text ;



	WritePrivateProfileString ( section , key , keyValue , FileName ) ;



		MessageBox.Show  ( "成功寫入INI文件!" , "信息" ) ;



		}


C#對INI文件進行讀操作:

正確讀取INI的必須滿足三個前提:INI文件的全路徑、段落名稱和關鍵字名稱。否則就無法正確讀取。你可以設定讀取不成功後的缺省數值,在下面的程序中,為了直觀設定的是“無法讀取對應數值!”字符串,讀取INI文件是通過button3組件的“Click”事件來實現的,下面是其對應的代碼清單:

private void button3_Click ( object sender , System.EventArgs e ) 



	{



		StringBuilder temp = new StringBuilder ( 255 ) ;



		string FileName = textBox1.Text ;



		string section = textBox2.Text ;



		string key = textBox3.Text ;



		int i = GetPrivateProfileString ( section , key ,"無法讀取對應數值!",



		temp , 255 , FileName ) ;



			//顯示讀取的數值



			textBox4.Text = temp.ToString  ( ) ;



		}


C#操作INI文件的完整源代碼(ini.cs)和運行界面


通過上面的這些介紹,我們不難得到用C#操作INI文件的完整代碼清單(ini.cs),具體如下:

using System ;



using System.Drawing ;



using System.Collections ;



using System.ComponentModel ;



using System.Windows.Forms ;



using System.Data ;



using System.Runtime.InteropServices ;



using System.Text ;



namespace C_操作INI文件__寫操作



{



	public class Form1 : System.Windows.Forms.Form



	{



		private System.Windows.Forms.Button button1 ;



		private System.Windows.Forms.TextBox textBox1 ;



		private System.Windows.Forms.Button button2 ;



		private System.Windows.Forms.TextBox textBox2 ;



		private System.Windows.Forms.TextBox textBox3 ;



		private System.Windows.Forms.TextBox textBox4 ;



		private System.Windows.Forms.Label label1 ;



		private System.Windows.Forms.Label label2 ;



		private System.Windows.Forms.Label label3 ;



		private System.Windows.Forms.Button button3 ;



		private System.Windows.Forms.OpenFileDialog openFileDialog1 ;



		private System.ComponentModel.Container components = null ;



		public Form1 ( ) 



		{



			InitializeComponent ( ) ;



		}



		protected override void Dispose (  bool disposing  ) 



		{



			if (  disposing  ) 



			{



				if  ( components != null )  



				{



					components.Dispose ( ) ;



				}



			}



			base.Dispose (  disposing  ) ;



		}







		[ 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 ) ;



		private void InitializeComponent ( ) 



		{



		this.button1 = new System.Windows.Forms.Button ( ) ;



		this.textBox1 = new System.Windows.Forms.TextBox ( ) ;



		this.button2 = new System.Windows.Forms.Button ( ) ;



		this.textBox2 = new System.Windows.Forms.TextBox ( ) ;



		this.textBox3 = new System.Windows.Forms.TextBox ( ) ;



		this.textBox4 = new System.Windows.Forms.TextBox ( ) ;



		this.label1 = new System.Windows.Forms.Label ( ) ;



		this.label2 = new System.Windows.Forms.Label ( ) ;



		this.label3 = new System.Windows.Forms.Label ( ) ;



		this.button3 = new System.Windows.Forms.Button ( ) ;



		this.openFileDialog1 = new 



System.Windows.Forms.OpenFileDialog ( ) ;



			this.SuspendLayout ( ) ;



	this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;



	this.button1.Location = new System.Drawing.Point ( 238 , 20 ) ;



	this.button1.Name = "button1" ;



	this.button1.Size = new System.Drawing.Size ( 100 , 32 ) ;



	this.button1.TabIndex = 0 ;



	this.button1.Text = "選擇INI文件" ;



	this.button1.Click += new System.EventHandler ( this.button1_Click ) ;



	this.textBox1.Location = new System.Drawing.Point ( 58 , 22 ) ;



	this.textBox1.Name = "textBox1" ;



	this.textBox1.Size = new System.Drawing.Size ( 162 , 21 ) ;



	this.textBox1.TabIndex = 1 ;



	this.textBox1.Text = "" ;



	this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;



	this.button2.Location = new System.Drawing.Point ( 86 , 168 ) ;



	this.button2.Name = "button2" ;



	this.button2.Size = new System.Drawing.Size ( 98 , 30 ) ;



	this.button2.TabIndex = 3 ;



	this.button2.Text = "寫入INI文件" ;



	this.button2.Click += new System.EventHandler ( this.button2_Click ) ;



	this.textBox2.Location = new System.Drawing.Point ( 160 , 62 ) ;



	this.textBox2.Name = "textBox2" ;



	this.textBox2.Size = new System.Drawing.Size ( 176 , 21 ) ;



	this.textBox2.TabIndex = 5 ;



	this.textBox2.Text = "" ;



	this.textBox3.Location = new System.Drawing.Point ( 160 , 94 ) ;



	this.textBox3.Name = "textBox3" ;



	this.textBox3.Size = new System.Drawing.Size ( 176 , 21 ) ;



	this.textBox3.TabIndex = 6 ;



	this.textBox3.Text = "" ;



	this.textBox4.Location = new System.Drawing.Point ( 160 , 128 ) ;



	this.textBox4.Name = "textBox4" ;



	this.textBox4.Size = new System.Drawing.Size ( 176 , 21 ) ;



	this.textBox4.TabIndex = 7 ;



	this.textBox4.Text = "" ;



	this.label1.Location = new System.Drawing.Point ( 56 , 62 ) ;



	this.label1.Name = "label1" ;



	this.label1.TabIndex = 8 ;



	this.label1.Text = "段落名稱:" ;



	this.label2.Location = new System.Drawing.Point ( 66 , 96 ) ;



	this.label2.Name = "label2" ;



	this.label2.TabIndex = 9 ;



	this.label2.Text = "關鍵字:" ;



	this.label3.Location = new System.Drawing.Point ( 42 , 130 ) ;



	this.label3.Name = "label3" ;



	this.label3.TabIndex = 10 ;



	this.label3.Text = "關鍵字數值:" ;



	this.button3.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;



	this.button3.Location = new System.Drawing.Point ( 208 , 168 ) ;



	this.button3.Name = "button3" ;



	this.button3.Size = new System.Drawing.Size ( 98 , 30 ) ;



	this.button3.TabIndex = 11 ;



	this.button3.Text = "讀取INI數值" ;



	this.button3.Click += new System.EventHandler ( this.button3_Click ) ;



	this.openFileDialog1.Filter = "INI 文件|*.ini" ;



	this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;



	this.ClientSize = new System.Drawing.Size ( 366 , 217 ) ;



	this.Controls.AddRange ( new System.Windows.Forms.Control [ ] {



		  this.button3 ,



		  this.textBox4 ,



		  this.textBox3 ,



		  this.textBox2 ,



		  this.button2 ,



		  this.textBox1 ,



		  this.button1 ,



		  this.label3 ,



	  this.label2 ,



		  this.label1 } ) ;



	this.MaximizeBox = false ;



	this.Name = "Form1" ;



	this.Text = "C#操作INI文件--寫操作" ;



	this.ResumeLayout ( false ) ;



	}



	[STAThread]



	static void Main ( )  



	{



		Application.Run ( new Form1 ( )  ) ;



	}



	private void button1_Click ( object sender , System.EventArgs e ) 



	{



		openFileDialog1.ShowDialog ( ) ;



		textBox1.Text = openFileDialog1.FileName ;



	}



	//寫入INI文件



	private void button2_Click ( object sender , System.EventArgs e ) 



	{



		string FileName = textBox1.Text ;



		string section = textBox2.Text ;



		string key = textBox3.Text ;



		string keyValue = textBox4.Text ;



		WritePrivateProfileString ( section , key , keyValue , FileName ) ;



		MessageBox.Show  ( "成功寫入INI文件!" , "信息" ) ;



	}



	//讀取指定INI文件的特定段落中的關鍵字的數值



	private void button3_Click ( object sender , System.EventArgs e ) 



	{



		StringBuilder temp = new StringBuilder ( 255 ) ;



		string FileName = textBox1.Text ;



		string section = textBox2.Text ;



		string key = textBox3.Text ;



		int i = GetPrivateProfileString ( section , key ,



		"無法讀取對應數值!" , emp , 255 , FileName ) ;



		//顯示讀取的數值



			textBox4.Text = temp.ToString  ( ) ;



		}



	}



}

總結

通過上面的這些介紹,可以看成C#操作INI文件的過程,其實就是C#調用Win32的API函數的過程。掌握了如何在C#申明Win32的API函數,再來操作INI就顯得非常簡單。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved