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 Sectionstring Keystring Value)
{
WritePrivateProfileString(SectionKeyValuethisinipath);
}
/// /// 读出INI文件
///
///
项目名称(如 [TypeName] )
///
键
public string IniReadValue(string Sectionstring Key)
{
StringBuilder temp = new StringBuilder();
int i = GetPrivateProfileString(SectionKeytempthisinipath);
return tempToString();
}
/// /// 验证文件是否存在
///
/// 布尔值
public bool ExistINIFile()
{
return FileExists(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就显得非常简单