- //in Config.h
- #pragma once
- #include <windows.h>
- #include <shlwapi.h>
- #pragma comment(lib,"shlwapi")
- #include <Tchar.h>
- class CConfig
- {
- public:
- CConfig(LPTSTR strFileName=NULL,LPTSTR strFilePath=NULL);
- virtual ~CConfig(void);
- private:
- TCHAR m_szFileName[MAX_PATH];
- TCHAR m_szFilePath[MAX_PATH];
- TCHAR m_szAppName[MAX_PATH];
- const TCHAR *m_pszFileExt;
- const TCHAR *m_pszFileDir;
- public:
- bool AddKey(LPCTSTR strKeyName, LPCTSTR strKeyValue,LPCTSTR strSectionName=NULL,LPCTSTR strFilePath=NULL);
- bool DeleteKey(LPCTSTR strDelKeyName,LPCTSTR strSectionName=NULL,LPCTSTR strFilePath=NULL);
- bool DeleteSection(LPCTSTR strDelSectionName=NULL,LPCTSTR strFilePath=NULL);
- bool ReadKeyValue(LPCTSTR strKeyName,OUT LPTSTR strKeyVal, LPCTSTR strSectionName=NULL,LPCTSTR strFilePath=NULL);
- bool ReadKeyValue(LPCTSTR strKeyName, OUT int &nKeyVal, LPCTSTR strSectionName=NULL,LPCTSTR strFilePath=NULL);
- bool ModifyKeyValue(LPCTSTR strKeyName, LPCTSTR strKeyValue,LPCTSTR strSectionName=NULL,LPCTSTR strFilePath=NULL);
- int GetSectionCount(LPCTSTR strFilePath=NULL);
- int GetKeyCount(LPCTSTR strSectionName=NULL, LPCTSTR strFilePath=NULL);
- };
- //in Config.cpp
- #include "Config.h"
- /************************************************************************************************************/
- /* */
- /* Function name : CConfig */
- /* Description : Create and initialize a CConfig Object.The parameter strFileName indicated the name
- of the ini file,it must not contain extension .ini.And strFilePath indicated the path
- of the ini file which to be created and stored.If strFileName or strFilePath is NULL,then
- use the app's name or current directory as default ini file name or path.If application
- calls this member function to create it's ini file at default path,then the ini file will
- be stored unifily in the subdirectory "...\config\".
- Attention:This function does not create an actual ini file. */
- /* */
- /************************************************************************************************************/
- CConfig::CConfig(LPTSTR strFileName,LPTSTR strFilePath)
- : m_pszFileExt(_T(".ini")),m_pszFileDir(_T("\\config"))
- {
- memset(m_szFileName,0,MAX_PATH);
- memset(m_szFilePath,0,MAX_PATH);
- memset(m_szAppName,0,MAX_PATH);
- ::GetModuleFileName(NULL,m_szFilePath,MAX_PATH);
- ::GetFileTitle(m_szFilePath,m_szFileName,MAX_PATH);
- ::PathRemoveExtension(m_szFileName);
- _tcscpy_s(m_szAppName,MAX_PATH,m_szFileName);
- if( strFilePath!=NULL)
- {
- /*if strFilePath is valid,copy it to m_szFilePath and handle it to a directory*/
- if(::PathIsDirectory(strFilePath))
- {
- _tcscpy_s(m_szFilePath,MAX_PATH,strFilePath);
- ::PathRemoveBackslash(m_szFilePath);
- ::PathAddBackslash(m_szFilePath);
- }
- else//use a default directory
- {
- ::PathRemoveFileSpec(m_szFilePath);
- ::PathAddBackslash(m_szFilePath);
- }
- }
- else
- {
- ::PathRemoveFileSpec(m_szFilePath);
- _tcscat_s(m_szFilePath,MAX_PATH,m_pszFileDir);
- if(!::PathFileExists(m_szFilePath))
- {
- ::CreateDirectory(m_szFilePath,NULL);
- }
- ::PathAddBackslash(m_szFilePath);
- if(strFileName !=NULL)
- {
- _tcscpy_s(m_szFileName,MAX_PATH,strFileName);
- }
- }
- _tcscat_s(m_szFileName,MAX_PATH,m_pszFileExt);
- _tcscat_s(m_szFilePath,MAX_PATH,m_szFileName);
- }
- CConfig::~CConfig(void)
- {
- }
- /************************************************************************************************************/
- /* */
- /* Function name : AddKey */
- /* Description : Create a key-value pair with format "strKeyName=strKeyValue" in the specified section by
- strSectionName.If strSectionName is NULL,then use the app's name as default section
- name to be added into. If the section specified by strSectionName does not exist, it is
- created. The strKeyValue will be modified if strKeyName already exists.This function
- creates an actual ini file.
- Return true if the function succeed,otherwise false.
- */
- /* */
- /************************************************************************************************************/
- bool CConfig::AddKey(LPCTSTR strKeyName, LPCTSTR strKeyValue,LPCTSTR strSectionName,LPCTSTR strFilePath)
- {
- LPCTSTR szSectionName;
- LPCTSTR szFilePath;
- if(strSectionName==NULL)
- szSectionName=m_szAppName;
- else
- szSectionName=strSectionName;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- if(::WritePrivateProfileString(szSectionName,strKeyName,strKeyValue,szFilePath))
- return true;
- else
- return false;
- }
- /************************************************************************************************************/
- /* */
- /* Function name : DeleteKey */
- /* Description : Delete a key and it's value from the specified section.If the parameter strSectionName is
- NULL,then delete the section with app's name.
- Return true if the function succeed,otherwise false. */
- /* */
- /************************************************************************************************************/
- bool CConfig::DeleteKey(LPCTSTR strDelKeyName,LPCTSTR strSectionName,LPCTSTR strFilePath)
- {
- LPCTSTR szSectionName;
- LPCTSTR szFilePath;
- if(strSectionName==NULL)
- szSectionName=m_szAppName;
- else
- szSectionName=strSectionName;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- if(::WritePrivateProfileString(szSectionName,strDelKeyName,NULL,szFilePath))
- return true;
- else
- return false;
- }
- /************************************************************************************************************/
- /* */
- /* Function name : DeleteSection */
- /* Description : Delete a specified section and all it's associated contents from the initialization file.
- If the parameter strDelSectionName is no offered,then delete the section with app's name.
- Return true if the function succeed,otherwise false.
- /* */
- /************************************************************************************************************/
- bool CConfig::DeleteSection(LPCTSTR strDelSectionName,LPCTSTR strFilePath)
- {
- LPCTSTR szSectionName;
- LPCTSTR szFilePath;
- if(strDelSectionName==NULL)
- szSectionName=m_szAppName;
- else
- szSectionName=strDelSectionName;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- if(::WritePrivateProfileString(szSectionName,NULL,NULL,szFilePath))
- return true;
- else
- return false;
- }
- /************************************************************************************************************/
- /* */
- /* Function name : ReadKeyValue */
- /* Description : Retrieves the value of strKeyName as String into the buffer specified by parameter
- strKeyVal.If the parameter strSectionName and strFilePath is no offered,then use the
- app's name as default section and ini file to be search.Return true if the function
- succeed,otherwise false,and the parameter strKeyVal will be set to NULL.
- /* */
- /************************************************************************************************************/
- bool CConfig::ReadKeyValue(LPCTSTR strKeyName, LPTSTR strKeyVal, LPCTSTR strSectionName,LPCTSTR strFilePath)
- {
- LPCTSTR szSectionName;
- LPCTSTR szFilePath;
- if(strSectionName==NULL)
- szSectionName=m_szAppName;
- else
- szSectionName=strSectionName;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- ::GetPrivateProfileString(szSectionName,strKeyName,NULL,strKeyVal,_tcslen(strKeyVal),szFilePath);
- if(_tcscmp(strKeyVal,_T(""))==0)
- return false;
- else
- return true;
- }
- /************************************************************************************************************/
- /* */
- /* Function name : ReadKeyValue */
- /* Description : Retrieves the value of strKeyName as Int into the buffer specified by parameter
- strKeyVal.If the parameter strSectionName and strFilePath is no offered,then use the
- app's name as default section and ini file to be search.Return true if the function
- succeed,otherwise false,and the parameter strKeyVal will be set to -1.*/
- /* */
- /************************************************************************************************************/
- bool CConfig::ReadKeyValue(LPCTSTR strKeyName, int &nKeyVal, LPCTSTR strSectionName,LPCTSTR strFilePath)
- {
- LPCTSTR szSectionName;
- LPCTSTR szFilePath;
- if(strSectionName==NULL)
- szSectionName=m_szAppName;
- else
- szSectionName=strSectionName;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- nKeyVal=::GetPrivateProfileInt(szSectionName,strKeyName,-1,szFilePath);
- if(-1 !=nKeyVal)
- return true;
- else
- return false;
- }
- /************************************************************************************************************/
- /* */
- /* Function name : ModifyKeyValue */
- /* Description : Replace the key value of strKeyName with strKeyValue .If the parameter strSectionName
- and strFilePath is no offered,then use the app's name as default section and ini file to
- be search.Return true if the function succeed,otherwise false. */
- /* */
- /************************************************************************************************************/
- bool CConfig::ModifyKeyValue(LPCTSTR strKeyName, LPCTSTR strKeyValue,LPCTSTR strSectionName,LPCTSTR strFilePath)
- {
- LPCTSTR szSectionName;
- LPCTSTR szFilePath;
- if(strSectionName==NULL)
- szSectionName=m_szAppName;
- else
- szSectionName=strSectionName;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- ::WritePrivateProfileString(szSectionName,strKeyName,NULL,szFilePath);
- if(::WritePrivateProfileString(szSectionName,strKeyName,strKeyValue,szFilePath))
- return true;
- else
- return false;
- }
- /************************************************************************************************************/
- /* */
- /* Function name : GetSectionCount */
- /* Description : Retrieves the number of all sections in the initialization file specified by strFilePath.
- if strFilePath is NULL,then use the app's name as default ini file to be search.If the
- function succeed,the return value is not -1. */
- /* */
- /************************************************************************************************************/
- int CConfig::GetSectionCount(LPCTSTR strFilePath)
- {
- TCHAR szItem[MAX_PATH]={0};
- LPCTSTR szFilePath;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- int nRet=::GetPrivateProfileSectionNames(szItem,MAX_PATH,szFilePath);
- int nSecCount=0;
- if(nRet !=MAX_PATH-2)
- {
- for(int i=0;i<MAX_PATH;i++)
- {
- if(szItem[i]==0 && szItem[i+1]!=0)
- {
- nSecCount++;
- }
- else if(szItem[i]==0 && szItem[i+1]==0)
- {
- nSecCount++;
- break;
- }
- }
- }
- else
- nSecCount=-1;
- return nSecCount;
- }
- /************************************************************************************************************/
- /* */
- /* Function name : GetKeyCount */
- /* Description : Retrieves the number of all key in the section specified by strSectionName in the
- initialization file specified by strFilePath.If strSectionName and strFilePath is NULL,
- then use the app's name as default section and ini file to be search.If the
- function succeed,the return value is not -1. */
- /* */
- /************************************************************************************************************/
- int CConfig::GetKeyCount(LPCTSTR strSectionName, LPCTSTR strFilePath)
- {
- TCHAR szItem[MAX_PATH]={0};
- LPCTSTR szSectionName;
- LPCTSTR szFilePath;
- if(strSectionName==NULL)
- szSectionName=m_szAppName;
- else
- szSectionName=strSectionName;
- if(strFilePath==NULL)
- szFilePath=m_szFilePath;
- else
- szFilePath=strFilePath;
- int nRet=::GetPrivateProfileSection(szSectionName,szItem,MAX_PATH,szFilePath);
- int nSecCount=0;
- if(nRet !=MAX_PATH-2)
- {
- for(int i=0;i<MAX_PATH;i++)
- {
- if(szItem[i]==0 && szItem[i+1]!=0)
- {
- nSecCount++;
- }
- else if(szItem[i]==0 && szItem[i+1]==0)
- {
- nSecCount++;
- break;
- }
- }
- }
- else
- nSecCount=-1;
- return nSecCount;
- }
- // in main function
- #include <iostream>
- #include "Config.h"
- int main()
- {
- CConfig MyConfig;
- MyConfig.AddKey(_T("ID"),_T("123456"));
- MyConfig.AddKey(_T("账户"),_T("123456"),_T("MySection"));
- MyConfig.AddKey(_T("余额"),_T("654321"),_T("MySection"));
- //MyConfig.DeleteKey(_T("ID"));
- //MyConfig.DeleteSection();
- LPCTSTR key=_T("ID");
- LPCTSTR key1=_T("账户");
- LPCTSTR key2=_T("余额");
- TCHAR szBuf[MAX_PATH]={0};
- LPTSTR pstrValue=szBuf;
- int nValue=0;
- MyConfig.ReadKeyValue(key,nValue);
- std::cout << "ID=" << nValue << std::endl;
- MyConfig.ReadKeyValue(key1,nValue,_T("MySection"));
- std::cout << "账户=" << nValue << std::endl;
- MyConfig.ReadKeyValue(key2,nValue,_T("MySection"));
- std::cout << "余额=" << nValue << std::endl;
- MyConfig.ModifyKeyValue(_T("余额"),_T("923475632"),_T("MySection"));
- MyConfig.ReadKeyValue(key2,nValue,_T("MySection"));
- std::cout << "余额=" << nValue << std::endl;
- std::cout << MyConfig.GetKeyCount(_T("MySection")) << std::endl;
- /*CConfig MyConfig2;
- MyConfig2.AddKey(_T("新增记录"),_T("4571498"));
- MyConfig2.AddKey(_T("新增记录"),_T("0775-4571498"));*/
- getchar();
- return 0;
- }
04-14 00:03