ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-08-22 02:00:30  阅读:204  来源: 互联网

标签:MFC 配置文件 lpFileName fileName LPCTSTR 键值 INI NULL pCfg


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,以及共同继续完善此接口类

标签:MFC,配置文件,lpFileName,fileName,LPCTSTR,键值,INI,NULL,pCfg
来源: https://www.cnblogs.com/veis/p/15171145.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有