##这是一个读写配置文件的类
- .h文件
#pragma once
#include <wtypes.h>
#include <afxstr.h>
#include <afxcoll.h>
//配置文件类 读写ini配置文件
/*
设置配置文件路径位置在GetAppdataDir()函数中
*/
class CConfigFile
{
public:
CConfigFile(void);
~CConfigFile(void);
//配置文件主要分为三部分:字段名 键名 键值
public:
static CConfigFile& instance();
public:
BOOL SetFileName(LPCTSTR lpFileName); //设置文件路径
CString GetFileName(void); //获得文件路径
//读取键值
CString GetAt(LPCTSTR szSection, LPCTSTR szName, LPCTSTR szDefault = nullptr) const;
int GetAt(LPCTSTR szSection, LPCTSTR szName, int nDefault) const;
double GetAt(LPCTSTR szSection, LPCTSTR szName, double fDefault) const;
//写入键值
void SetAt(LPCTSTR szSection, LPCTSTR szName, LPCTSTR szValue);
void SetAt(LPCTSTR szSection, LPCTSTR szName, int value);
void SetAt(LPCTSTR szSection, LPCTSTR szName, double value);
BOOL DelSection(LPCTSTR lpSection);//删除字段
BOOL DelKey(LPCTSTR lpSection, LPCTSTR lpKey); //删除某一字段下的键名
CString GetValue(LPCTSTR lpSection, LPCTSTR lpKey); //得到某一字段下某一键名的键值.
BOOL SetValue(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue,bool bCreate = true);//设置键值,bCreate是指段名及键名未存在时,是否创建
int GetSections(CStringArray& arrSection);//得到全部的段名
int GetKeyValues(int& nCount,CStringArray& arrKey,CStringArray& arrValue, LPCTSTR lpSection);//得到字段下键的总数、键名、和键值
BOOL DelAllSections();//删除所有的字段
private:
CString GetIniValue(LPCTSTR section, LPCTSTR valueName, LPCTSTR sz_default) const;
void SetIniValue(LPCTSTR section, LPCTSTR valueName, LPCTSTR value);
bool IsStartOfOne(LPCTSTR sz, LPCTSTR beg);
bool IsEndOfOne(LPCTSTR sz, LPCTSTR end);
CString Combine(LPCTSTR szPath1, LPCTSTR szPath2);
CString GetAppdataDir();//用户信息目录
private:
CString m_strAppdataFile; // 放置在appdata目录下
};
#define G_ConfigFile (CConfigFile::instance())
- .cpp文件
#include "StdAfx.h"
#include "ConfigFile.h"
#include <shlobj.h>
#define MAX_ALLKEYS 6000 //全部的键名
#define MAX_KEY 260 //一个键名长度
#define MAX_ALLSECTIONS 2048 //全部的段名
#define MAX_SECTION 260 //一个段名长度
CConfigFile::CConfigFile(void)
{
m_strAppdataFile = GetAppdataDir();
}
CConfigFile::~CConfigFile(void)
{
}
CConfigFile& CConfigFile::instance()
{
static CConfigFile inst;
return inst;
}
BOOL CConfigFile::SetFileName( LPCTSTR lpFileName )
{
CFile file;
CFileStatus status;
if(!file.GetStatus(lpFileName,status))
return TRUE;
m_strAppdataFile = lpFileName;
return FALSE;
}
CString CConfigFile::GetFileName( void )
{
return m_strAppdataFile;
}
CString CConfigFile::GetAt( LPCTSTR szSection, LPCTSTR szName, LPCTSTR szDefault /*= nullptr*/ ) const
{
return GetIniValue(szSection, szName, szDefault);
}
int CConfigFile::GetAt( LPCTSTR szSection, LPCTSTR szName, int nDefault ) const
{
TCHAR sz[10];
_itot_s(nDefault, sz, 10);
const auto result = GetIniValue(szSection, szName, sz);
return _ttoi(result);
}
double CConfigFile::GetAt( LPCTSTR szSection, LPCTSTR szName, double fDefault ) const
{
CString strDefault;
strDefault.Format(_T("%G"), fDefault);
const auto result = GetIniValue(szSection, szName, strDefault);
return _ttof(result);
}
void CConfigFile::SetAt( LPCTSTR szSection, LPCTSTR szName, LPCTSTR szValue )
{
SetIniValue(szSection, szName, szValue);
}
void CConfigFile::SetAt( LPCTSTR szSection, LPCTSTR szName, int value )
{
TCHAR sz[10];
_itot_s(value, sz, 10);
SetIniValue(szSection, szName, sz);
}
void CConfigFile::SetAt( LPCTSTR szSection, LPCTSTR szName, double value )
{
CString strValue;
strValue.Format(_T("%G"), value);
SetIniValue(szSection, szName, strValue);
}
BOOL CConfigFile::DelSection( LPCTSTR lpSection )
{
if(WritePrivateProfileString(lpSection,NULL,NULL,m_strAppdataFile))
return FALSE;
else
return GetLastError();
}
BOOL CConfigFile::DelKey( LPCTSTR lpSection, LPCTSTR lpKey )
{
if(WritePrivateProfileString(lpSection,lpKey,NULL,m_strAppdataFile))
return FALSE;
else
return GetLastError();
}
CString CConfigFile::GetValue( LPCTSTR lpSection, LPCTSTR lpKey )
{
DWORD dValue;
TCHAR lpValue[MAX_PATH] ={0};
dValue=GetPrivateProfileString(lpSection,lpKey,_T(""),lpValue,MAX_PATH,m_strAppdataFile);
return lpValue;
}
BOOL CConfigFile::SetValue( LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpValue,bool bCreate /*= true*/ )
{
TCHAR lpTemp[MAX_PATH] ={0};
//以下if语句表示如果设置bCreate为false时,当没有这个键名时则返回TRUE(表示出错)
//!*&*none-value*&!* 这是个垃圾字符没有特别意义,这样乱写是防止凑巧相同。
if (!bCreate)
{
GetPrivateProfileString(lpSection,lpKey,_T("!*&*none-value*&!*"),lpTemp,MAX_PATH,m_strAppdataFile);
if(_tcscmp(lpTemp,_T("!*&*none-value*&!*"))==0)
return TRUE;
}
if(WritePrivateProfileString(lpSection,lpKey,lpValue,m_strAppdataFile))
return FALSE;
else
return GetLastError();
}
int CConfigFile::GetSections( CStringArray& arrSection )
{
/*
本函数基础:
GetPrivateProfileSectionNames - 从 ini 文件中获得 Section 的名称
如果 ini 中有两个 Section: [sec1] 和 [sec2],则返回的是 'sec1',0,'sec2',0,0 ,当你不知道
ini 中有哪些 section 的时候可以用这个 api 来获取名称
*/
int i;
int iPos = 0;
int iMaxCount;
TCHAR chSectionNames[MAX_ALLSECTIONS] = {0}; //总的提出来的字符串
TCHAR chSection[MAX_SECTION] = {0}; //存放一个段名。
GetPrivateProfileSectionNames(chSectionNames,MAX_ALLSECTIONS,m_strAppdataFile);
//以下循环,截断到两个连续的0
for(i = 0; i < MAX_ALLSECTIONS; i++)
{
if (chSectionNames[i] == 0)
if (chSectionNames[i] == chSectionNames[i+1])
break;
}
iMaxCount = i + 1; //要多一个0号元素。即找出全部字符串的结束部分。
arrSection.RemoveAll();//清空原数组
for(i = 0; i < iMaxCount; i++)
{
chSection[iPos++] = chSectionNames[i];
if(chSectionNames[i] == 0)
{
if (chSection != _T(""))
{
arrSection.Add(chSection);
}
memset(chSection,0,MAX_SECTION);
iPos=0;
}
}
return (int)arrSection.GetSize();
}
int CConfigFile::GetKeyValues( int& nCount,CStringArray& arrKey,CStringArray& arrValue, LPCTSTR lpSection )
{
/*
本函数基础:
GetPrivateProfileSection- 从 ini 文件中获得一个Section的全部键名及值名
如果ini中有一个段,其下有 "段1=值1" "段2=值2",则返回的是 '段1=值1',0,'段2=值2',0,0 ,当你不知道
获得一个段中的所有键及值可以用这个。
*/
nCount = 0;
int i = 0;
int iPos=0;
CString strKeyValue;
int iMaxCount = 0;
TCHAR chKeyNames[MAX_ALLKEYS]={0}; //总的提出来的字符串
TCHAR chKey[MAX_KEY]={0}; //提出来的一个键名
GetPrivateProfileSection(lpSection,chKeyNames,MAX_ALLKEYS,m_strAppdataFile);
for(i=0;i<MAX_ALLKEYS;i++)
{
if (chKeyNames[i] == 0)
if (chKeyNames[i] == chKeyNames[i+1])
break;
}
iMaxCount=i+1; //要多一个0号元素。即找出全部字符串的结束部分。
arrKey.RemoveAll();//清空原数组
arrValue.RemoveAll();
for(i=0; i<iMaxCount; i++)
{
chKey[iPos++] = chKeyNames[i];
if(chKeyNames[i] == 0)
{
strKeyValue = chKey;
CString strKey = strKeyValue.Left(strKeyValue.Find(_T('=')));
if (strKey != _T(""))
{
arrKey.Add(strKeyValue.Left(strKeyValue.Find(_T('='))));
arrValue.Add(strKeyValue.Mid(strKeyValue.Find(_T('='))+1));
nCount++;
}
memset(chKey,0,MAX_KEY);
iPos = 0;
}
}
return (int)arrKey.GetSize();
}
BOOL CConfigFile::DelAllSections()
{
int nSection;
CStringArray arrSection;
nSection = GetSections(arrSection);
for(int i = 0; i < nSection; i++)
{
if(DelSection(arrSection[i]))
return GetLastError();
}
return FALSE;
}
CString CConfigFile::GetIniValue( LPCTSTR section, LPCTSTR valueName, LPCTSTR sz_default ) const
{
CString value;
auto dwRs = ::GetPrivateProfileString(section, valueName, sz_default, value.GetBuffer(256), 256, m_strAppdataFile);
value.ReleaseBuffer();
if (0x2 != GetLastError())
{
// 成功
return value;
}
return value = sz_default;
}
void CConfigFile::SetIniValue( LPCTSTR section, LPCTSTR valueName, LPCTSTR value )
{
::WritePrivateProfileString(section, valueName, value, m_strAppdataFile);
}
bool CConfigFile::IsStartOfOne( LPCTSTR sz, LPCTSTR beg )
{
if (nullptr == sz || _T('\0') == *sz)
{
return false;
}
for (auto p = beg; nullptr != p && _T('\0') != *p; ++p)
{
if (*sz == *p)
{
return true;
}
}
return false;
}
bool CConfigFile::IsEndOfOne( LPCTSTR sz, LPCTSTR end )
{
if (nullptr == sz || _T('\0') == *sz)
{
return false;
}
auto p = sz + _tcslen(sz) - 1;
for (auto pEnd = end; pEnd != nullptr && _T('\0') != *pEnd; pEnd++)
{
if (*pEnd == *p)
{
return true;
}
}
return false;
}
CString CConfigFile::Combine( LPCTSTR szPath1, LPCTSTR szPath2 )
{
CString result = szPath1;
bool bPath1EndHas = IsEndOfOne(szPath1, _T("/\\"));
bool bPath2Start = IsStartOfOne(szPath2, _T("\\/"));
if (bPath1EndHas&&bPath2Start)
{
result += szPath2 + 1;
}
else if (!bPath1EndHas && !bPath2Start)
{
result += _T('\\');
result += szPath2;
}
else
{
result += szPath2;
}
return result;
}
CString CConfigFile::GetAppdataDir()
{
TCHAR szPath[_MAX_PATH];
::SHGetSpecialFolderPath(nullptr, szPath, CSIDL_APPDATA, TRUE);//得到的是C盘中:C:\Users\17621\AppData\Roaming下的目录
CString strDir = Combine(szPath, _T("\\WT"));
::CreateDirectory(strDir, nullptr);
strDir = Combine(strDir, _T("Datas"));
::CreateDirectory(strDir, nullptr);
return strDir;
}