分享一个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);
}

欢迎指出bug,以及共同继续完善此接口类

上一篇:第八章——第三节--文件包含漏洞篇之本地文件和远程文件包含漏洞


下一篇:MySQL 8 + Navicat for MySQL安装步骤