Ini配置文件读写(Win32, C++)

CIniHelper.h

#pragma once

#include <string>
#include <tchar.h>

#ifdef _UNICODE
using _tstring = std::wstring;
#else
using _tstring = std::string;
#endif

class CIniHelper
{
public:
    CIniHelper();
    CIniHelper(const _tstring& strFileName, bool isAbsolutePath = false);
    ~CIniHelper();

    //设置获取配置文件路径
    void SetPath(const _tstring& strFilePath, bool isAbsolutePath = false);
    _tstring GetPath() const;

    //读写字符串
    bool SetString(const _tstring& strAppName, const _tstring& strKeyName, const _tstring& strString);
    _tstring GetString(const _tstring& strAppName, const _tstring& strKeyName, const _tstring& strDefault = _T("")) const;

    //读写数字
    bool SetNumber(const _tstring& strAppName, const _tstring& strKeyName, int dwNumber);
    int GetNumber(const _tstring& strAppName, const _tstring& strKeyName, int dwDefault = -1) const;

    //读写浮点数
    bool SetFloat(const _tstring& strAppName, const _tstring& strKeyName, double dwNumber);
    double GetFloat(const _tstring& strAppName, const _tstring& strKeyName, double dwDefault = -1) const;

    //读写数字(十六进制)
    bool SetHex(const _tstring& strAppName, const _tstring& strKeyName, int dwNumber);
    int GetHex(const _tstring& strAppName, const _tstring& strKeyName, int dwDefault = -1) const;

    //删除配置值
    bool DeleteValue(const _tstring& strAppName, const _tstring& strKeyName = _T(""));

    static _tstring GetCurrentModulePath();
    static _tstring GetCurrentModuleDir();
    static _tstring GetCurrentModuleName(bool bHasExt = false);
    static bool IsDirectory(const _tstring& strPath);

private:
    _tstring m_strFilePath;  //配置文件路径
};

CIniHelper.cpp

#include "CIniHelper.h"

#include <windows.h>
#include <strsafe.h>

#define FROFILE_STRING_MAX_CHARACTERS_SIZE      (1024 * 64)
#define FROFILE_EXTERN_NAME                     _T(".ini")

CIniHelper::CIniHelper()
    :
    m_strFilePath(GetCurrentModuleDir())
{
    m_strFilePath += _T("\\");
    m_strFilePath += GetCurrentModuleName(false);
    m_strFilePath += FROFILE_EXTERN_NAME;
}

CIniHelper::CIniHelper(const _tstring& strFileName, bool isAbsolutePath)
{
    if (isAbsolutePath)
    {
        m_strFilePath = strFileName;
    }
    else
    {
        m_strFilePath = GetCurrentModuleDir();
        m_strFilePath += _T("\\");
        m_strFilePath += strFileName;
    }
}

CIniHelper::~CIniHelper()
{
}

void CIniHelper::SetPath(const _tstring& strFilePath, bool isAbsolutePath)
{
    if (isAbsolutePath)
    {
        m_strFilePath = strFilePath;
    }
    else
    {
        m_strFilePath = GetCurrentModuleDir();
        m_strFilePath += _T("\\");
        m_strFilePath += strFilePath;
    }
}

_tstring CIniHelper::GetPath() const
{
    return m_strFilePath;
}

bool CIniHelper::SetString(const _tstring& strAppName, const _tstring& strKeyName, const _tstring& strString)
{
    return ::WritePrivateProfileString(strAppName.c_str(), strKeyName.c_str(), strString.c_str(), m_strFilePath.c_str());
}

_tstring CIniHelper::GetString(const _tstring& strAppName, const _tstring& strKeyName, const _tstring& strDefault) const
{
    _tstring strResult;

    LPTSTR lpBuf = (LPTSTR)::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, FROFILE_STRING_MAX_CHARACTERS_SIZE * sizeof(TCHAR));
    if (NULL != lpBuf)
    {
        ::GetPrivateProfileString(strAppName.c_str(), strKeyName.c_str(), strDefault.c_str(), lpBuf, FROFILE_STRING_MAX_CHARACTERS_SIZE, m_strFilePath.c_str());
        strResult = lpBuf;
    }

    if (NULL != lpBuf)
    {
        ::HeapFree(::GetProcessHeap(), 0, lpBuf);
    }

    return strResult;
}

bool CIniHelper::SetNumber(const _tstring& strAppName, const _tstring& strKeyName, int dwNumber)
{
    TCHAR szBuf[MAX_PATH] = { 0 };
    _itot_s(dwNumber, szBuf, 10);
    return this->SetString(strAppName, strKeyName, szBuf);
}

int CIniHelper::GetNumber(const _tstring& strAppName, const _tstring& strKeyName, int dwDefault) const
{
    TCHAR szBuf[MAX_PATH] = { 0 };
    _itot_s(dwDefault, szBuf, 10);
    _tstring strText = this->GetString(strAppName, strKeyName, szBuf);
    return _tcstoul(strText.c_str(), nullptr, 10);
}

//读写浮点数
bool CIniHelper::SetFloat(const _tstring& strAppName, const _tstring& strKeyName, double dwNumber)
{
    TCHAR szBuf[MAX_PATH] = { 0 };
    StringCchPrintf(szBuf, _countof(szBuf), _T("%lf"), dwNumber);
    return this->SetString(strAppName, strKeyName, szBuf);
}

double CIniHelper::GetFloat(const _tstring& strAppName, const _tstring& strKeyName, double dwDefault/* = -1*/) const
{
    TCHAR szBuf[MAX_PATH] = { 0 };
    StringCchPrintf(szBuf, _countof(szBuf), _T("%lf"), dwDefault);
    _tstring strText = this->GetString(strAppName, strKeyName, szBuf);

    return _tstof(strText.c_str());
}

bool CIniHelper::SetHex(const _tstring& strAppName, const _tstring& strKeyName, int dwNumber)
{
    TCHAR szBuf[MAX_PATH] = { 0 };
    StringCchPrintf(szBuf, _countof(szBuf), _T("0x%X"), dwNumber);
    return this->SetString(strAppName, strKeyName, szBuf);
}

int CIniHelper::GetHex(const _tstring& strAppName, const _tstring& strKeyName, int dwDefault) const
{
    TCHAR szBuf[MAX_PATH] = { 0 };
    StringCchPrintf(szBuf, _countof(szBuf), _T("0x%X"), dwDefault);
    _tstring strText = this->GetString(strAppName, strKeyName, szBuf);
    return _tcstoul(strText.c_str(), nullptr, 16);
}

bool CIniHelper::DeleteValue(const _tstring& strAppName, const _tstring& strKeyName)
{
    if (strKeyName.empty())
    {
        return ::WritePrivateProfileString(strAppName.c_str(), nullptr, NULL, m_strFilePath.c_str());
    }
    else
    {
        return ::WritePrivateProfileString(strAppName.c_str(), strKeyName.c_str(), NULL, m_strFilePath.c_str());
    }
}

_tstring CIniHelper::GetCurrentModulePath()
{
    TCHAR szCurPath[MAX_PATH] = { 0 };
    ::GetModuleFileName(NULL, szCurPath, _countof(szCurPath));

    _tstring strDir = szCurPath;
    return strDir;
}

_tstring CIniHelper::GetCurrentModuleDir()
{
    _tstring strDir = GetCurrentModulePath();
    strDir.resize(strDir.find_last_of(_T('\\')));
    return strDir;
}

_tstring CIniHelper::GetCurrentModuleName(bool bHasExt/* = false*/)
{
    _tstring strDir = GetCurrentModulePath();
    size_t nIndex = strDir.find_last_of(_T('\\'));
    if (nIndex != _tstring::npos)
    {
        strDir = strDir.substr(nIndex + 1);
    }

    if (!bHasExt)
    {
        nIndex = strDir.find_last_of(_T('.'));
        if (nIndex != _tstring::npos)
        {
            strDir.resize(nIndex);
        }
    }

    return strDir;
}

bool CIniHelper::IsDirectory(const _tstring& strPath)
{
    DWORD dwAttr = ::GetFileAttributes(strPath.c_str());
    if (INVALID_FILE_ATTRIBUTES == dwAttr)
    {
        return false;
    }

    return FILE_ATTRIBUTE_DIRECTORY == (FILE_ATTRIBUTE_DIRECTORY & dwAttr);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值