C#读取ini文件中某个节点(Section)下的条目(返回“key=value”形式)

论坛 期权论坛     
选择匿名的用户   2021-6-2 19:58   114   0
<p>今天想写一个完全只需要修改ini文件就可以动态改变某个winform内部结构的小模块,其中需要用到直接返回ini文件中原模原样的“key&#61;value”形式的数据又或者经过加工后返回Dictionary对象。找了老半天最后找到一个网友转发的ini类,然后我把它改了标题转发出来让有同需求的人更容易找到;</p>
<p> </p>
<pre class="blockcode"><code class="language-cs">

namespace IO_Form
{

    /// &lt;summary&gt;
    /// 利用Windows API读写INI文件
    /// 写入时,如果没有INI文件,自动创建INI
    /// 如果在创建时,GetLastError:5 检查IniPath是否添加了文件名称.ini
    /// &lt;/summary&gt;
    public class INI
    {


        #region INI文件操作



        /*

            * 针对INI文件的API操作方法,其中的节点(Section)、键(KEY)都不区分大小写

            * 如果指定的INI文件不存在,会自动创建该文件。

            *

            * CharSet定义的时候使用了什么类型,在使用相关方法时必须要使用相应的类型

            *      例如 GetPrivateProfileSectionNames声明为CharSet.Auto,那么就应该使用 Marshal.PtrToStringAuto来读取相关内容

            *      如果使用的是CharSet.Ansi,就应该使用Marshal.PtrToStringAnsi来读取内容

            *      

            */



        #region API声明



        /// &lt;summary&gt;

        /// 获取所有节点名称(Section)

        /// &lt;/summary&gt;

        /// &lt;param name&#61;&#34;lpszReturnBuffer&#34;&gt;存放节点名称的内存地址,每个节点之间用\0分隔&lt;/param&gt;

        /// &lt;param name&#61;&#34;nSize&#34;&gt;内存大小(characters)&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpFileName&#34;&gt;Ini文件&lt;/param&gt;

        /// &lt;returns&gt;内容的实际长度,为0表示没有内容,为nSize-2表示内存大小不够&lt;/returns&gt;

        [DllImport(&#34;kernel32.dll&#34;, CharSet &#61; CharSet.Auto)]

        private static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, uint nSize, string lpFileName);



        /// &lt;summary&gt;

        /// 获取某个指定节点(Section)中所有KEY和Value

        /// &lt;/summary&gt;

        /// &lt;param name&#61;&#34;lpAppName&#34;&gt;节点名称&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpReturnedString&#34;&gt;返回值的内存地址,每个之间用\0分隔&lt;/param&gt;

        /// &lt;param name&#61;&#34;nSize&#34;&gt;内存大小(characters)&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpFileName&#34;&gt;Ini文件&lt;/param&gt;

        /// &lt;returns&gt;内容的实际长度,为0表示没有内容,为nSize-2表示内存大小不够&lt;/returns&gt;

        [DllImport(&#34;kernel32.dll&#34;, CharSet &#61; CharSet.Auto)]

        private static extern uint GetPrivateProfileSection(string lpAppName, IntPtr lpReturnedString, uint nSize, string lpFileName);



        /// &lt;summary&gt;

        /// 读取INI文件中指定的Key的值

        /// &lt;/summary&gt;

        /// &lt;param name&#61;&#34;lpAppName&#34;&gt;节点名称。如果为null,则读取INI中所有节点名称,每个节点名称之间用\0分隔&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpKeyName&#34;&gt;Key名称。如果为null,则读取INI中指定节点中的所有KEY,每个KEY之间用\0分隔&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpDefault&#34;&gt;读取失败时的默认值&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpReturnedString&#34;&gt;读取的内容缓冲区,读取之后,多余的地方使用\0填充&lt;/param&gt;

        /// &lt;param name&#61;&#34;nSize&#34;&gt;内容缓冲区的长度&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpFileName&#34;&gt;INI文件名&lt;/param&gt;

        /// &lt;returns&gt;实际读取到的长度&lt;/returns&gt;

        [DllImport(&#34;kernel32.dll&#34;, CharSet &#61; CharSet.Auto)]

        private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, [In, Out] char[] lpReturnedString, uint nSize, string lpFileName);



        //另一种声明方式,使用 StringBuilder 作为缓冲区类型的缺点是不能接受\0字符,会将\0及其后的字符截断,

        //所以对于lpAppName或lpKeyName为null的情况就不适用

        [DllImport(&#34;kernel32.dll&#34;, CharSet &#61; CharSet.Auto)]

        private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);



        //再一种声明,使用string作为缓冲区的类型同char[]

        [DllImport(&#34;kernel32.dll&#34;, CharSet &#61; CharSet.Auto)]

        private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, string lpReturnedString, uint nSize, string lpFileName);



        /// &lt;summary&gt;

        /// 将指定的键值对写到指定的节点,如果已经存在则替换。

        /// &lt;/summary&gt;

        /// &lt;param name&#61;&#34;lpAppName&#34;&gt;节点,如果不存在此节点,则创建此节点&lt;/param&gt;

        /// &lt;param name&#61;&#34;lpString&#34;&gt;Item键值对,多个用\0分隔,形
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP