ini文件读写(从API出发看问题)

在写这篇文章之前搜索过网上关于ini读写的博文,但是读取Section下所有key的方法很难找到,(最后还是被我找到了^_^)。下面先来说下ini:(**我是cp的**)

 

**在作应用系统开发时,管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起,现在的配置文件大都是以xml文档来存储。比如Visual Studio.Net自身的配置文件Mashine.config,Asp.Net的配置文件Web.Config,包括我在介绍Remoting中提到的配置文件,都是xml的格式。

传统的配置文件ini已有被xml文件逐步代替的趋势,但对于简单的配置,ini文件还是有用武之地的。ini文件其实就是一个文本文件,它有固定的格式,节Section的名字用[]括起来,然后换行说明key的值:
[section]
key=value

如数据库服务器配置文件:

DBServer.ini

[Server]
Name=localhost
[DB]
Name=NorthWind
[User]
Name=sa**

 

在 c#中只有通过win api才能操作ini,所以我们要看api是怎么写的:

(1) BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);
  其中各参数的意义:
   LPCTSTR lpAppName 是INI文件中的一个字段名.
   LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.
   LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.

LPCTSTR lpFileName 是完整的INI文件名.
(2) DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);
  其中各参数的意义:
   前二个参数与 WritePrivateProfileString中的意义一样.

   lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.
   lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.
   nSize : 目的缓存器的大小.
   lpFileName : 是完整的INI文件名.
网上所有的版本的api参数大部分都是一致的,除了GetPrivateProfileString的第4个参数LPTSTR lpReturnedString,接收INI文件中的值的CString对象,即目的缓存器,既然是缓存器,那就可能是数组,也可能是stringbuilder.所以我们有2种选择。

当我们选择第一种的时候,就可以把Section的所有key取进lpReturnedString里面。

当我们选择第一种的时候,就只能把Section的第一个key取进lpReturnedString里面。

我觉得大家都理解了,看代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;

namespace iniReadAndWrite
{
    class Program
    {
        #region API函数声明

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key,
            string val, string filePath);

        [DllImport("kernel32")]
        //[难点1]第4个参数也可以写成StringBuilder retVal;设置成byte[]就可以支持难点2
        private static extern long GetPrivateProfileString(string section, string key,
            string def, byte[] retVal, int size, string filePath);


        #endregion
        #region 读Ini文件
        //[难点2]key为空时就可以取得Section下所有的key.
        public static string ReadIniData(string Section, string Key, string NoText, string iniFilePath)
        {
            if (File.Exists(iniFilePath))
            {
                byte[] temp = new byte[65535];
                long buflen = GetPrivateProfileString(Section, Key, NoText, temp, temp.GetUpperBound(0), iniFilePath);
                string s = Encoding.GetEncoding(0).GetString(temp);
                s = s.Substring(0, (int)buflen);               
                return s.Trim();
                //下面的第4个参数是StringBuilder
                //StringBuilder temp = new StringBuilder(1024);
                //GetPrivateProfileString(Section, Key, NoText, temp, 1024, iniFilePath);
                //return temp.ToString();
            }
            else
            {
                return String.Empty;
            }
        }

        #endregion

        #region 写Ini文件
        public static bool WriteIniData(string Section, string Key, string Value, string iniFilePath)
        {
            if (File.Exists(iniFilePath))
            {
                long OpStation = WritePrivateProfileString(Section, Key, Value, iniFilePath);
                if (OpStation == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }
        #endregion
        static void Main(string[] args)
        {
            WriteIniData("Staus", "vbts5", "Running", @"c://t.ini");
            WriteIniData("Staus", "vbts4", "Running", @"c://t.ini");
            WriteIniData("Staus", "vbts5", "NotRunning", @"c://t.ini");

            Console.WriteLine(ReadIniData("Staus", "vbts5", "", @"c://t.ini"));
            Console.WriteLine(ReadIniData("Staus", null, null, @"c://t.ini"));
        }
    }
}

BTW:可以跟我留言指出我的错误。谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值