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