• 分享一个MFC操作本地INI配置文件的类


    MFC操作本地INI配置文件的类

    简述

    ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。下面程序就是对Windows API二次封装的操作类

    使用示例

    测试平台:VS2019
    此处示例只有关键代码

    // 1.定义INI文件操作对象
    CIniFileEdit m_cfgFile;
    
    // 2.定义键值对象并初始化,设置文件路径(也可在键值对象里面做初始化)
    m_cfgFile.SetFileHandle(_T("./DownloadConfig.ini"));
    
    cfg.lpAppName = _T("PATH");
    cfg.lpKeyName = _T("filepath");
    cfg.lpFileName = NULL;
    
    // 4.调用相关接口
    // 获取键值接口调用示例
    m_cfgFile.GetProfileString(&cfg, str);
    AfxMessageBox(str);
    
    // 设置键值接口调用示例
    cfg.lpKeyName = _T("hexpath");
    cfg.lpString = _T("D:/C++&CODE/m0.hex");
    m_cfgFile.SetProfileString(&cfg);
    m_cfgFile.GetProfileString(&cfg, str);
    AfxMessageBox(str);
    
    // 删除子键值接口调用示例
    m_cfgFile.RemoveProfileSubKey(_T("PATH"), _T("code"));
    
    // 删除节点键值接口调用示例
    m_cfgFile.RemoveProfileKey(_T("PATH"));
    

    头文件

    #pragma once
    
    /* INI本地配置文件解析类 */
    class CIniFileEdit
    {
    	LPCTSTR m_pCfgFile; // INI配置文件路径
    
    public:
    	typedef struct 
    	{
    		LPCTSTR lpAppName;  // INI文件中的一个字段名.
    		LPCTSTR lpKeyName;  // lpAppName下的一个键名,通俗讲就是变量名.
    		LPCTSTR lpString;   // 键值, 也就是变量的值,不过必须为LPCTSTR型或CString型的.
    		LPCTSTR lpFileName; // 配置文件路径
    	} CfgStrStruct;
    
    	typedef struct
    	{
    		LPCTSTR lpAppName;  // INI文件中的一个字段名.
    		LPCTSTR lpKeyName;  // lpAppName下的一个键名,通俗讲就是变量名.
    		INT nDefault;       // 键值, 也就是变量的值,不过必须为LPCTSTR型或CString型的.
    		LPCTSTR lpFileName; // 配置文件路径
    	} CfgIntStruct;
    
    public:
    	// 构造与析构函数
    	CIniFileEdit(LPCTSTR file=NULL);
    	virtual ~CIniFileEdit();
    
    	// 初始化文件/获取文件路径,把路径首地址值作为一个句柄存储到m_pCfgFile
    	void SetFileHandle(LPCTSTR handle);
    	LPCTSTR GetFileHandle(void);
    
    	// 字符串类型键值操作
    	DWORD GetProfileString(CfgStrStruct *pCfg, CString &nReturn); // 读取键值
    	BOOL SetProfileString(CfgStrStruct *pCfg); // 写入键值
    
    	// 数值类型键值操作
    	UINT GetProfileInt(CfgIntStruct* pCfg, INT nDefault); // 读取键值
    
    	// 删除键操作
    	BOOL RemoveProfileKey(LPCTSTR lpAppName, LPCTSTR lpFileName = NULL); // 删除节点
    	BOOL RemoveProfileSubKey(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpFileName = NULL); // 删除键值
    
    };
    

    源文件

    #include "pch.h"
    #include "CIniFileEdit.h"
    
    CIniFileEdit::CIniFileEdit(LPCTSTR file)
    {
        m_pCfgFile = file;
    }
    
    CIniFileEdit::~CIniFileEdit()
    {
    }
    
    /*
     * @brief:设置本地INI配置文件路径
     * @param:
     *      handle:INI配置文件路径
     **/
    void CIniFileEdit::SetFileHandle(LPCTSTR handle)
    {
        m_pCfgFile = handle;
    }
    
    /*
     * @brief:获取本地INI配置文件路径
     * @return:返回m_pCfgFile的值,若用户未初始化则缺省为NULL
     **/
    LPCTSTR CIniFileEdit::GetFileHandle(void)
    {
        return m_pCfgFile;
    }
    
    /*
     * @brief:获取字符串键值
     * @param:
     *      pCfg:键值结构体
     *      szReturn:返回值缓冲区
     * @return:返回值是复制到缓冲区的字符数,不包括空终止字符
     **/
    DWORD CIniFileEdit::GetProfileString(CfgStrStruct* pCfg, CString& szReturn)
    {
        if (NULL == pCfg->lpFileName && NULL == m_pCfgFile)
            return NULL;
    
        LPCTSTR fileName;
    
        if (NULL != pCfg->lpFileName)
            fileName = pCfg->lpFileName;
        else
            fileName = m_pCfgFile;
    
        return ::GetPrivateProfileString(pCfg->lpAppName, pCfg->lpKeyName, pCfg->lpString, 
            szReturn.GetBuffer(MAX_PATH), MAX_PATH, fileName);
    }
    
    /*
     * @brief:把键值写入本地INI配置文件
     * @param:
     *      pCfg:键值结构体,详情见@CfgIntStruct
     * @return:成功返回TRUE,否则返回FALSE
     **/
    BOOL CIniFileEdit::SetProfileString(CfgStrStruct* pCfg)
    {
        if (NULL == pCfg->lpFileName && NULL == m_pCfgFile)
            return NULL;
    
        LPCTSTR fileName;
    
        if (NULL != pCfg->lpFileName)
            fileName = pCfg->lpFileName;
        else
            fileName = m_pCfgFile;
    
        return ::WritePrivateProfileString(pCfg->lpAppName, pCfg->lpKeyName, pCfg->lpString, fileName);
    }
    
    /*
     * @brief:获取字符串键值
     * @param:
     *      pCfg:键值结构体
     *      nDefault:默认返回值(注:当读取不到键值时,默认返回)
     * @return:返回值是复制到缓冲区的字符数,不包括空终止字符
     **/
    UINT CIniFileEdit::GetProfileInt(CfgIntStruct* pCfg, INT nDefault)
    {
        if (NULL == pCfg->lpFileName && NULL == m_pCfgFile)
            return NULL;
    
        LPCTSTR fileName;
    
        if (NULL != pCfg->lpFileName)
            fileName = pCfg->lpFileName;
        else
            fileName = m_pCfgFile;
    
        return ::GetPrivateProfileInt(pCfg->lpAppName, pCfg->lpKeyName, nDefault, fileName);
    }
    
    /*
     * @brief:删除顶层节点键值
     * @param:
     *      lpAppName:节点键值名称
     *      lpFileName:配置文件路径,缺省为NULL,使用m_pCfgFile的值
     * @return:成功返回TRUE,否则返回FALSE
     **/
    BOOL CIniFileEdit::RemoveProfileKey(LPCTSTR lpAppName, LPCTSTR lpFileName)
    {
        if (NULL == lpFileName && NULL == m_pCfgFile)
            return NULL;
    
        LPCTSTR fileName;
    
        if (NULL != lpFileName)
            fileName = lpFileName;
        else
            fileName = m_pCfgFile;
    
        return ::WritePrivateProfileString(lpAppName, NULL , NULL, fileName);
    }
    
    /*
     * @brief:删除子键值
     * @param:
     *      lpAppName:节点键值名称
     *      lpKeyName:子键值名称
     *      lpFileName:配置文件路径,缺省为NULL,使用m_pCfgFile的值
     * @return:成功返回TRUE,否则返回FALSE
     **/
    BOOL CIniFileEdit::RemoveProfileSubKey(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpFileName)
    {
        if (NULL == lpFileName && NULL == m_pCfgFile)
            return NULL;
    
        LPCTSTR fileName;
    
        if (NULL != lpFileName)
            fileName = lpFileName;
        else
            fileName = m_pCfgFile;
    
        return ::WritePrivateProfileString(lpAppName, lpKeyName, NULL, fileName);
    }
    
    Posted By veis
  • 相关阅读:
    详说清除浮动
    ie7 z-index 失效问题
    ul里不能直接嵌套div(在ie7以前版本)
    jQuery 发送验证码倒计时按钮
    VBA: Cant find project or librar
    InstallShield Limited Edition制作安装文件
    InstallShield制作升级安装包
    VBA 获取Sheet最大行
    求两条线段交点zz
    VBA找不到progress bar的处理办法。
  • 原文地址:https://www.cnblogs.com/veis/p/15171145.html
Copyright © 2020-2023  润新知