INI文件就是擴展名為ini的文件在Windows系統中INI文件是很多最重要的就是SysteminiSystemini和Winini該文件主要存放用戶所做的選擇以及系統的各種參數用戶可以通過修改INI文件來改變應用程序和系統的很多配置但自從Windows 的退出在Windows系統中引入了注冊表的概念INI文件在Windows系統的地位就開始不斷下滑這是因為注冊表的獨特優點使應用程序和系統都把許多參數和初始化信息放進了注冊表中但在某些場合INI文件還擁有其不可替代的地位本文就來探討一下C#是如何對INI進行讀寫操作
INI文件的結構
INI文件是一種按照特點方式排列的文本文件每一個INI文件構成都非常類似由若干段落(section)組成在每個帶括號的標題下面是若干個以單個單詞開頭的關鍵詞(keyword)和一個等號等號右邊的就是關鍵字對應的值(value)其一般形式如下
[Section]
KeyWord = Valuel
KeyWord = Value
……
[Section]
KeyWord = Value
KeyWord = Value
C#和Win API函數
C#並不像C++擁有屬於自己的類庫C#使用的類庫是Net框架為所有Net程序開發提供的一個共有的類庫——Net FrameWork SDK雖然Net FrameWork SDK內容十分龐大功能也非常強大但還不能面面俱到至少它並沒有提供直接操作INI文件所需要的相關的類在本文中C#操作INI文件使用的是Windows系統自帶Win的API函數——WritePrivateProfileString()和GetPrivateProfileString()函數這二個函數都位於kerneldll文件中
我們知道在C#中使用的類庫都是托管代碼(Managed Code)文件而Win的API函數所處的文件都是非托管代碼(Unmanaged Code)文件這就導致了在C#中不可能直接使用這些非托管代碼文件中的函數好在Net框架為了保持對下的兼容也為了充分利用以前的資源提出了互操作通過互操作可以實現對Win的API函數的調用互操作不僅適用於Win的API函數還可以用來訪問托管的COM對象C#中對Win的API函數的互操作是通過命名空間SystemRuntimeInteropServices中的DllImport特征類來實現的它的主要作用是指示此屬性化方法是作為非托管DLL的輸出實現的下面代碼就是在C#利用命名空間SystemRuntimeInteropServices中的DllImport特征類申明上面二個Win的API函數
C#申明INI文件的寫操作函數WritePrivateProfileString()
[ DllImport ( kernel ) ]
private static extern long WritePrivateProfileString ( string
section
string key string val string filePath ) ;
參數說明sectionINI文件中的段落keyINI文件中的關鍵字valINI文件中關鍵字的數值filePathINI文件的完整的路徑和名稱
C#申明INI文件的讀操作函數GetPrivateProfileString()
[ DllImport ( kernel ) ]
private static extern int GetPrivateProfileString ( string section
string key string def StringBuilder retVal
int size string filePath ) ;
參數說明sectionINI文件中的段落名稱keyINI文件中的關鍵字def無法讀取時候時候的缺省數值retVal讀取數值size數值的大小filePathINI文件的完整路徑和名稱
下面是一個讀寫INI文件的類
public class INIClass
{
public string inipath;
[DllImport(kernel)]
private static extern long WritePrivateProfileString(string sectionstring keystring valstring filePath);
[DllImport(kernel)]
private static extern int GetPrivateProfileString(string sectionstring keystring defStringBuilder retValint sizestring filePath);
///
/// 構造方法
///
///
文件路徑
public INIClass(string INIPath)
{
inipath = INIPath;
}
///
/// 寫入INI文件
/// ///
項目名稱(如 [TypeName] )
///
鍵
///
值
public void IniWriteValue(string Section
string Key
string Value)
{
WritePrivateProfileString(Section
Key
Value
this
inipath);
}
///
/// 讀出INI文件
/// ///
項目名稱(如 [TypeName] )
///
鍵
public string IniReadValue(string Section
string Key)
{
StringBuilder temp = new StringBuilder(
);
int i = GetPrivateProfileString(Section
Key
temp
this
inipath);
return temp
ToString();
}
///
/// 驗證文件是否存在
/// ///
布爾值 public bool ExistINIFile()
{
return File
Exists(inipath);
}
}
C#對INI文件進行寫操作
對INI文件進行寫操作是通過組件button的Click事件來實現的這裡有一點應該注意當在調用WritePrivateProfileString()對INI文件進行寫操作的時候如果此時在INI文件中存在和要寫入的信息相同的段落名稱和關鍵字則將覆蓋此INI信息下面是button組件的Click事件對應的代碼清單
private void button_Click ( object sender SystemEventArgs e )
{
string FileName = textBoxText ;
string section = textBoxText ;
string key = textBoxText ;
string keyValue = textBoxText ;
WritePrivateProfileString ( section key keyValue FileName ) ;
MessageBoxShow ( 成功寫入INI文件! 信息 ) ;
}
C#對INI文件進行讀操作
正確讀取INI的必須滿足三個前提INI文件的全路徑段落名稱和關鍵字名稱否則就無法正確讀取你可以設定讀取不成功後的缺省數值在下面的程序中為了直觀設定的是無法讀取對應數值!字符串讀取INI文件是通過button組件的Click事件來實現的下面是其對應的代碼清單
private void button_Click ( object sender SystemEventArgs e )
{
StringBuilder temp = new StringBuilder ( ) ;
string FileName = textBoxText ;
string section = textBoxText ;
string key = textBoxText ;
int i = GetPrivateProfileString ( section key 無法讀取對應數值!
temp FileName ) ;
//顯示讀取的數值
textBoxText = tempToString ( ) ;
}
using System ;
using SystemDrawing ;
using SystemCollections ;
using SystemComponentModel ;
using SystemWindowsForms ;
using SystemData ;
using SystemRuntimeInteropServices ;
using SystemText ;
namespace C_操作INI文件__寫操作
{
public class Form : SystemWindowsFormsForm
{
private SystemWindowsFormsButton button ;
private SystemWindowsFormsTextBox textBox ;
private SystemWindowsFormsButton button ;
private SystemWindowsFormsTextBox textBox ;
private SystemWindowsFormsTextBox textBox ;
private SystemWindowsFormsTextBox textBox ;
private SystemWindowsFormsLabel label ;
private SystemWindowsFormsLabel label ;
private SystemWindowsFormsLabel label ;
private SystemWindowsFormsButton button ;
private SystemWindowsFormsOpenFileDialog openFileDialog ;
private SystemComponentModelContainer components = null ;
public Form ( )
{
InitializeComponent ( ) ;
}
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
componentsDispose ( ) ;
}
}
baseDispose ( disposing ) ;
}
[ DllImport ( kernel ) ]
private static extern long WritePrivateProfileString ( string
section
string key string val string filePath ) ;
[ DllImport ( kernel ) ]
private static extern int GetPrivateProfileString ( string section
string key string def StringBuilder retVal
int size string filePath ) ;
private void InitializeComponent ( )
{
thisbutton = new SystemWindowsFormsButton ( ) ;
thistextBox = new SystemWindowsFormsTextBox ( ) ;
thisbutton = new SystemWindowsFormsButton ( ) ;
thistextBox = new SystemWindowsFormsTextBox ( ) ;
thistextBox = new SystemWindowsFormsTextBox ( ) ;
thistextBox = new SystemWindowsFormsTextBox ( ) ;
thislabel = new SystemWindowsFormsLabel ( ) ;
thislabel = new SystemWindowsFormsLabel ( ) ;
thislabel = new SystemWindowsFormsLabel ( ) ;
thisbutton = new SystemWindowsFormsButton ( ) ;
thisopenFileDialog = new
SystemWindowsFormsOpenFileDialog ( ) ;
thisSuspendLayout ( ) ;
thisbuttonFlatStyle = SystemWindowsFormsFlatStyleFlat ;
thisbuttonLocation = new SystemDrawingPoint ( ) ;
thisbuttonName = button ;
thisbuttonSize = new SystemDrawingSize ( ) ;
thisbuttonTabIndex = ;
thisbuttonText = 選擇INI文件 ;
thisbuttonClick += new SystemEventHandler ( thisbutton_Click ) ;
thistextBoxLocation = new SystemDrawingPoint ( ) ;
thistextBoxName = textBox ;
thistextBoxSize = new SystemDrawingSize ( ) ;
thistextBoxTabIndex = ;
thistextBoxText = ;
thisbuttonFlatStyle = SystemWindowsFormsFlatStyleFlat ;
thisbuttonLocation = new SystemDrawingPoint ( ) ;
thisbuttonName = button ;
thisbuttonSize = new SystemDrawingSize ( ) ;
thisbuttonTabIndex = ;
thisbuttonText = 寫入INI文件 ;
thisbuttonClick += new SystemEventHandler ( thisbutton_Click ) ;
thistextBoxLocation = new SystemDrawingPoint ( ) ;
thistextBoxName = textBox ;
thistextBoxSize = new SystemDrawingSize ( ) ;
thistextBoxTabIndex = ;
thistextBoxText = ;
thistextBoxLocation = new SystemDrawingPoint ( ) ;
thistextBoxName = textBox ;
thistextBoxSize = new SystemDrawingSize ( ) ;
thistextBoxTabIndex = ;
thistextBoxText = ;
thistextBoxLocation = new SystemDrawingPoint ( ) ;
thistextBoxName = textBox ;
thistextBoxSize = new SystemDrawingSize ( ) ;
thistextBoxTabIndex = ;
thistextBoxText = ;
thislabelLocation = new SystemDrawingPoint ( ) ;
thislabelName = label ;
thislabelTabIndex = ;
thislabelText = 段落名稱 ;
thislabelLocation = new SystemDrawingPoint ( ) ;
thislabelName = label ;
thislabelTabIndex = ;
thislabelText = 關鍵字 ;
thislabelLocation = new SystemDrawingPoint ( ) ;
thislabelName = label ;
thislabelTabIndex = ;
thislabelText = 關鍵字數值 ;
thisbuttonFlatStyle = SystemWindowsFormsFlatStyleFlat ;
thisbuttonLocation = new SystemDrawingPoint ( ) ;
thisbuttonName = button ;
thisbuttonSize = new SystemDrawingSize ( ) ;
thisbuttonTabIndex = ;
thisbuttonText = 讀取INI數值 ;
thisbuttonClick += new SystemEventHandler ( thisbutton_Click ) ;
thisopenFileDialogFilter = INI 文件|*ini ;
thisAutoScaleBaseSize = new SystemDrawingSize ( ) ;
thisClientSize = new SystemDrawingSize ( ) ;
thisControlsAddRange ( new SystemWindowsFormsControl [ ] {
thisbutton
thistextBox
thistextBox
thistextBox
thisbutton
thistextBox
thisbutton
thislabel
thislabel
thislabel } ) ;
thisMaximizeBox = false ;
thisName = Form ;
thisText = C#操作INI文件寫操作 ;
thisResumeLayout ( false ) ;
}
[STAThread]
static void Main ( )
{
ApplicationRun ( new Form ( ) ) ;
}
private void button_Click ( object sender SystemEventArgs e )
{
openFileDialogShowDialog ( ) ;
textBoxText = openFileDialogFileName ;
}
//寫入INI文件
private void button_Click ( object sender SystemEventArgs e )
{
string FileName = textBoxText ;
string section = textBoxText ;
string key = textBoxText ;
string keyValue = textBoxText ;
WritePrivateProfileString ( section key keyValue FileName ) ;
MessageBoxShow ( 成功寫入INI文件! 信息 ) ;
}
//讀取指定INI文件的特定段落中的關鍵字的數值
private void button_Click ( object sender SystemEventArgs e )
{
thisControlsAddRange ( new SystemWindowsFormsControl [ ] {
thisbutton
thistextBox
thistextBox
thistextBox
thisbutton
thistextBox
thisbutton
thislabel
thislabel
thislabel } ) ;
thisMaximizeBox = false ;
thisName = Form ;
thisText = C#操作INI文件寫操作 ;
thisResumeLayout ( false ) ;
}
[STAThread]
static void Main ( )
{
ApplicationRun ( new Form ( ) ) ;
}
private void button_Click ( object sender SystemEventArgs e )
{
openFileDialogShowDialog ( ) ;
textBoxText = openFileDialogFileName ;
}
//寫入INI文件
private void button_Click ( object sender SystemEventArgs e )
{
string FileName = textBoxText ;
string section = textBoxText ;
string key = textBoxText ;
string keyValue = textBoxText ;
WritePrivateProfileString ( section key keyValue FileName ) ;
MessageBoxShow ( 成功寫入INI文件! 信息 ) ;
}
//讀取指定INI文件的特定段落中的關鍵字的數值
private void button_Click ( object sender SystemEventArgs e )
{
StringBuilder temp = new StringBuilder ( ) ;
string FileName = textBoxText ;
string section = textBoxText ;
string key = textBoxText ;
int i = GetPrivateProfileString ( section key
無法讀取對應數值! emp FileName ) ;
//顯示讀取的數值
textBoxText = tempToString ( ) ;
}
}
}
總結
通過上面的這些介紹可以看成C#操作INI文件的過程其實就是C#調用Win的API函數的過程掌握了如何在C#申明Win的API函數再來操作INI就顯得非常簡單
From:http://tw.wingwit.com/Article/program/ASP/201311/21793.html