zoukankan      html  css  js  c++  java
  • C#读写ini文件操作

    ini文件,是windows操作系统下的配置文件,ini文件是一种按照特点方式排列的文本文件,它的构成分为三部分,结构如下:

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


    文件由若干个段落(section)组成,每个段落又分成若干个键(key)和值(value)。

    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”特征类来实现对windows api函数的使用,它的主要作用是指示此属性化方法是作为非托管DLL的输出实现的。

    C#申明INI文件的写操作函数WritePrivateProfileString():

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

    C#申明INI文件的读操作函数GetPrivateProfileString():

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

    下面是我写的一个例子:

    当我输入完后,点击录入按钮时候,就会写入到ini文件中:

    当点击读取按钮的时候就会把INI文件中的节点信息的值填充到窗体中的文本框中

    后台代码:

    在项目名称空间的上方要添加以下的引用:

    using System.Runtime.InteropServices;//引用命名空间,该空间为了调用windows api。

     1       #region "声明变量"
     2 
     3         /// <summary>
     4         /// 写入INI文件
     5         /// </summary>
     6         /// <param name="section">节点名称[如[TypeName]]</param>
     7         /// <param name="key"></param>
     8         /// <param name="val"></param>
     9         /// <param name="filepath">文件路径</param>
    10         /// <returns></returns>
    11         [DllImport("kernel32")]
    12         private static extern long WritePrivateProfileString(string section,string key,string val,string filepath);
    13         /// <summary>
    14         /// 读取INI文件
    15         /// </summary>
    16         /// <param name="section">节点名称</param>
    17         /// <param name="key"></param>
    18         /// <param name="def"></param>
    19         /// <param name="retval">stringbulider对象</param>
    20         /// <param name="size">字节大小</param>
    21         /// <param name="filePath">文件路径</param>
    22         /// <returns></returns>
    23         [DllImport("kernel32")]
    24         private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retval,int size,string filePath);
    25         #endregion    


    申明全局路径的变量:

    1         private string strFilePath = Application.StartupPath + "\MyConfig.ini";//获取INI文件路径
    2         private string strSec = ""; //INI文件名


    声明下,我的ini文件是新建在debug下面的:

     1        private void bt_write_Click(object sender, EventArgs e)
     2         {
     3             try
     4             {
     5 
     6                 //根据INI文件名设置要写入INI文件的节点名称
     7                 //此处的节点名称完全可以根据实际需要进行配置
     8                 strSec = Path.GetFileNameWithoutExtension(strFilePath);
     9                 WritePrivateProfileString(strSec, "user", text_user.Text.Trim(), strFilePath);
    10                 WritePrivateProfileString(strSec, "password", text_password.Text.Trim(), strFilePath);
    11                 MessageBox.Show("录入成功");
    12 
    13             }
    14             catch (Exception ex)
    15             {
    16                 MessageBox.Show(ex.Message.ToString());
    17 
    18             }
    19 
    20         }
    //  读取按钮事件
    
     1 private void bt_read_Click(object sender, EventArgs e)
     2         {
     3             if (File.Exists(strFilePath))//读取时先要判读INI文件是否存在
     4             {
     5 
     6                 strSec = Path.GetFileNameWithoutExtension(strFilePath);
     7                 text_user.Text = ContentValue(strSec, "user");
     8                 text_password.Text = ContentValue(strSec, "password");
     9             }
    10             else
    11             {
    12                 MessageBox.Show("MyConfig.ini文件不存在");
    13             }
    14         }


    在读取的时候用到了自定义读取函数的方法,在该方法中调用了系统函数,

    1         private string ContentValue(string Section, string key)
    2         {
    3             StringBuilder temp = new StringBuilder(32);
    4             GetPrivateProfileString(Section, key, "", temp, 32, strFilePath);
    5             return temp.ToString();
    6         }


    以上所述的就是简单的用C#语言操作INI文件的过程,只用到了系统函数中的两个(写入函数和读取函数)还有其他的函数比如说时删除INI文件函数等等,删除INI文件函数其实就是把键对应的值设置为null就可以了。自动登录和连接设置都用到了INI文件。

    作者:orange1438
    出处:http://www.cnblogs.com/orange1438/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    podium服务器端的微前端开发框架
    几个java proxy servlet 工具
    Presto Infrastructure at Lyft
    cube.js 通过presto-gateway 进行连接
    presto-gateway nodejs client
    presto-gateway 试用以及docker 镜像制作
    presto-gateway lyft 团队开源的prestodb 的负载均衡、代理、网关工具
    Singer 修改tap-s3-csv 支持minio 连接
    plotly-dash 简单使用(一)
    smashing 三方widgets 使用
  • 原文地址:https://www.cnblogs.com/orange1438/p/4544952.html
Copyright © 2011-2022 走看看