.NET(C#)读写ini配置文件的方法及示例代码

本文主要介绍.NET(C#)中,实现读写ini配置文件两种方法(系统函数和自定义类),以及相关的示例代码。

1、使用WindowsAPI函数实现

using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
namespace MyINI
{
    class IniFile  
    {
        string Path;
        string EXE = Assembly.GetExecutingAssembly().GetName().Name;
        [DllImport("kernel32", CharSet = CharSet.Unicode)]
        static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);
        [DllImport("kernel32", CharSet = CharSet.Unicode)]
        static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);
        public IniFile(string IniPath = null)
        {
            Path = new FileInfo(IniPath ?? EXE + ".ini").FullName;
        }
        public string Read(string Key, string Section = null)
        {
            var RetVal = new StringBuilder(255);
            GetPrivateProfileString(Section ?? EXE, Key, "", RetVal, 255, Path);
            return RetVal.ToString();
        }
        public void Write(string Key, string Value, string Section = null)
        {
            WritePrivateProfileString(Section ?? EXE, Key, Value, Path);
        }
        public void DeleteKey(string Key, string Section = null)
        {
            Write(Key, null, Section ?? EXE);
        }
        public void DeleteSection(string Section = null)
        {
            Write(null, null, Section ?? EXE);
        }
        public bool KeyExists(string Key, string Section = null)
        {
            return Read(Key, Section).Length > 0;
        }
    }
}

调用方法:

1)通过以下三种方式之一打开 INI 文件

//在与可执行文件相同的目录中创建或加载INI文件
//命名为EXE.ini(其中EXE是可执行文件的名称)
var MyIni = new IniFile();
//或在当前目录中指定一个配置文件的名称
var MyIni = new IniFile("Settings.ini");
// 或者在指定的目录中指定一个配置文件的名称
var MyIni = new IniFile(@"C:\Settings.ini");

2)写入配置

MyIni.Write("SiteName", "cjavapy");
MyIni.Write("Url", "https://www.cjavapy.com"); 

写入的内容如下: 

[MyINI]
SiteName=cjavapy
Url=https://www.cjavapy.com

3)从 INI 文件中读取值

var siteName = MyIni.Read("SiteName");
var url = MyIni.Read("Url");

4)写入配置时指下配置项:

MyIni.Write("SiteName", "cjavapy", "MyWeb");
MyIni.Write("Url", "https://www.cjavapy.com", "MyWeb");

写入的内容如下:

[MyINI]
SiteName=cjavapy
Url=https://www.cjavapy.com
[MyWeb]
SiteName=cjavapy
Url=https://www.cjavapy.com

5)判断配置是否存在

if(!MyIni.KeyExists("Remark", "Audio"))
{
    MyIni.Write("Remark", "Note", "Audio");
}

6)删除配置Key

MyIni.DeleteKey("Remark", "Audio");

7)删除配置项

MyIni.DeleteSection("MyWeb");

2、使用自定义类实现

using System;
using System.IO;
using System.Collections;
public class IniParser
{
    private Hashtable keyPairs = new Hashtable();
    private String iniFilePath;
    private struct SectionPair
    {
        public String Section;
        public String Key;
    }
    /// <summary>
    /// 在给定的路径上打开INI文件并枚举IniParser中的值。
    /// </summary>
    /// <param name="iniPath">Full path to INI file.</param>
    public IniParser(String iniPath)
    {
        TextReader iniFile = null;
        String strLine = null;
        String currentRoot = null;
        String[] keyPair = null;
        iniFilePath = iniPath;
        if (File.Exists(iniPath))
        {
            try
            {
                iniFile = new StreamReader(iniPath);
                strLine = iniFile.ReadLine();
                while (strLine != null)
                {
                    strLine = strLine.Trim().ToUpper();
                    if (strLine != "")
                    {
                        if (strLine.StartsWith("[") && strLine.EndsWith("]"))
                        {
                            currentRoot = strLine.Substring(1, strLine.Length - 2);
                        }
                        else
                        {
                            keyPair = strLine.Split(new char[] { '=' }, 2);
                            SectionPair sectionPair;
                            String value = null;
                            if (currentRoot == null)
                                currentRoot = "ROOT";
                            sectionPair.Section = currentRoot;
                            sectionPair.Key = keyPair[0];
                            if (keyPair.Length > 1)
                                value = keyPair[1];
                            keyPairs.Add(sectionPair, value);
                        }
                    }
                    strLine = iniFile.ReadLine();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (iniFile != null)
                    iniFile.Close();
            }
        }
        else
            throw new FileNotFoundException("Unable to locate " + iniPath);
    }
    /// <summary>
    /// 返回给定section的值,key对。
    /// </summary>
    /// <param name="sectionName">Section name</param>
    /// <param name="settingName">Key name</param>
    public String GetSetting(String sectionName, String settingName)
    {
        SectionPair sectionPair;
        sectionPair.Section = sectionName.ToUpper();
        sectionPair.Key = settingName.ToUpper();
        return (String)keyPairs[sectionPair];
    }
    /// <summary>
    /// 列出给定的Section的所有行
    /// </summary>
    /// <param name="sectionName">Section to enum.</param>
    public String[] EnumSection(String sectionName)
    {
        ArrayList tmpArray = new ArrayList();
        foreach (SectionPair pair in keyPairs.Keys)
        {
            if (pair.Section == sectionName.ToUpper())
                tmpArray.Add(pair.Key);
        }
        return (String[])tmpArray.ToArray(typeof(String));
    }
    /// <summary>
    /// 向要保存的表添加或替换设置。
    /// </summary>
    /// <param name="sectionName">Section to add under.</param>
    /// <param name="settingName">Key name to add.</param>
    /// <param name="settingValue">Value of key.</param>
    public void AddSetting(String sectionName, String settingName, String settingValue)
    {
        SectionPair sectionPair;
        sectionPair.Section = sectionName.ToUpper();
        sectionPair.Key = settingName.ToUpper();
        if (keyPairs.ContainsKey(sectionPair))
            keyPairs.Remove(sectionPair);
        keyPairs.Add(sectionPair, settingValue);
    }
    /// <summary>
    /// 用空值添加或替换要保存的表的设置。
    /// </summary>
    /// <param name="sectionName">Section</param>
    /// <param name="settingName">Key</param>
    public void AddSetting(String sectionName, String settingName)
    {
        AddSetting(sectionName, settingName, null);
    }
    /// <summary>
    /// 删除设置
    /// </summary>
    /// <param name="sectionName">指定Section</param>
    /// <param name="settingName">添加的Key</param>
    public void DeleteSetting(String sectionName, String settingName)
    {
        SectionPair sectionPair;
        sectionPair.Section = sectionName.ToUpper();
        sectionPair.Key = settingName.ToUpper();
        if (keyPairs.ContainsKey(sectionPair))
            keyPairs.Remove(sectionPair);
    }
    /// <summary>
    /// 保存设置到新文件。
    /// </summary>
    /// <param name="newFilePath">新的文件路径。</param>
    public void SaveSettings(String newFilePath)
    {
        ArrayList sections = new ArrayList();
        String tmpValue = "";
        String strToSave = "";
        foreach (SectionPair sectionPair in keyPairs.Keys)
        {
            if (!sections.Contains(sectionPair.Section))
                sections.Add(sectionPair.Section);
        }
        foreach (String section in sections)
        {
            strToSave += ("[" + section + "]\r\n");
            foreach (SectionPair sectionPair in keyPairs.Keys)
            {
                if (sectionPair.Section == section)
                {
                    tmpValue = (String)keyPairs[sectionPair];
                    if (tmpValue != null)
                        tmpValue = "=" + tmpValue;
                    strToSave += (sectionPair.Key + tmpValue + "\r\n");
                }
            }
            strToSave += "\r\n";
        }
        try
        {
            TextWriter tw = new StreamWriter(newFilePath);
            tw.Write(strToSave);
            tw.Close();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    /// <summary>
    /// 将设置保存回ini文件。
    /// </summary>
    public void SaveSettings()
    {
        SaveSettings(iniFilePath);
    }
}

调用方法:

niParser parser = new IniParser(@"C:\Settings.ini");
String newMessage;
newMessage = parser.GetSetting("MyWeb", "SiteName");
newMessage += parser.GetSetting("MyWeb", "Url");
newMessage += parser.GetSetting("MyINI", "Remark");


推荐阅读
cjavapy编程之路首页