使用C#读写ini文件

使用C#读写ini文件要用到Windows的API函数:GetPrivateProfileString、WritePrivateProfileString,下面对该方法进行封装并以具体ini文件为例说明如何读写。

1、ini文件示例

; FTP服务器参数
[FtpServer]
IP=127.0.0.1
Port=21
UserName=user
Password=user

2、IniHelper.cs

public static class IniHelper
{
    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    // ReSharper disable once UnusedMember.Local
    private static extern long WritePrivateProfileString(string section, string key, string value, string filePath);

    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    private static extern int GetPrivateProfileString(string section, string key, string defaultValue,
        StringBuilder resultValue, int size, string filePath);

    public static string ReadStr(string section, string key, string defaultValue, string filePath)
    {
        var ret = new StringBuilder(255);
        GetPrivateProfileString(section, key, defaultValue, ret, ret.Capacity, filePath);
        return ret.ToString();
    }

    public static int ReadInt(string section, string key, int defaultValue, string filePath)
    {
        var text = ReadStr(section, key, $"{defaultValue}", filePath);
        return int.TryParse(text, out var intValue) ? intValue : defaultValue;
    }

    public static void WriteValue(string section, string key, string value, string filePath)
    {
        WritePrivateProfileString(section, key, value, filePath);
    }
}

3、IniConfigManager.cs

internal sealed class IniConfigManager
{
    public string FtpIp { get; private set; } //FTP服务器IP
    public int FtpPort { get; private set; } //FTP服务器端口
    public string FtpUserName { get; private set; } //FTP服务器用户名
    public string FtpPassword { get; private set; } //FTP服务器密码

    private readonly string _iniPath = Path.Combine(Application.StartupPath, "AppSettings.ini"); //ini配置文件路径
    private readonly ILog _logger = LogManager.GetLogger(nameof(IniConfigManager));

    /// <summary>
    /// 加载配置文件
    /// </summary>
    public void LoadConfig()
    {
        try
        {
            //FTP服务器参数
            FtpIp = IniHelper.ReadStr("FtpServer", "IP", "127.0.0.1", _iniPath);
            FtpPort = IniHelper.ReadInt("FtpServer", "Port", 21, _iniPath);
            FtpUserName = IniHelper.ReadStr("FtpServer", "UserName", "user", _iniPath);
            FtpPassword = IniHelper.ReadStr("FtpServer", "Password", "user", _iniPath);
        }
        catch (Exception e)
        {
            _logger.Error($@"加载ini配置文件失败:{e.Message}.");
        }
    }

    //设置STP服务器参数
    public void SetFtpConfig(string ip, int port, string userName, string password)
    {
        FtpIp = ip;
        FtpPort = port;
        FtpUserName = userName;
        FtpPassword = password;

        try
        {
            IniHelper.WriteValue("FtpServer", "IP", ip, _iniPath);
            IniHelper.WriteValue("FtpServer", "Port", $"{port}", _iniPath);
            IniHelper.WriteValue("FtpServer", "UserName", userName, _iniPath);
            IniHelper.WriteValue("FtpServer", "Password", password, _iniPath);
        }
        catch (Exception e)
        {
            _logger.Error($@"设置STP服务器参数失败:{e.Message}.");
            throw;
        }
    }

    #region 单例模式

    private static IniConfigManager _instance;

    private static readonly object LockInstanceHelper = new object();

    private IniConfigManager()
    {
    }

    public static IniConfigManager Instance
    {
        get
        {
            if (_instance != null)
            {
                return _instance;
            }

            lock (LockInstanceHelper)
            {
                _instance = _instance ?? new IniConfigManager();
            }

            return _instance;
        }
    }

    #endregion
}
posted @ 2024-03-09 16:57  xhubobo  阅读(436)  评论(0编辑  收藏  举报