MFC总结(7)--- 操作Ini文件 操作

来源:互联网 发布:大闹天宫进阶数据 编辑:程序博客网 时间:2024/06/06 01:18

  1、建立一个操作Ini文件的类,将操作ini文件的相关方法都封装到该类中


MyIniClass.h文件

#pragma once#include <vector>using std::vector;class CMyIniClass{public:CMyIniClass();virtual ~CMyIniClass();//    设置ini文件路径//    成功返回TRUE;否则返回FALSEBOOL         SetPath(CString strPath);//    检查section是否存在//    存在返回TRUE;否则返回FALSEBOOL         SectionExist(CString strSection);//    从指定的Section和Key读取KeyValue//    返回KeyValueCString         GetKeyValue(CString    strSection,CString    strKey);//    设置Section、Key以及KeyValue,若Section或者Key不存在则创建void          SetKeyValue(CString    strSection,CString    strKey,CString    strKeyValue);//    删除指定Section下的一个Keyvoid          DeleteKey(CString strSection,CString strKey);//    删除指定的Section以及其下的所有Keyvoid          DeleteSection(CString strSection);//    获得所有的Section//    返回Section数目int              GetAllSections(CStringArray& strArrSection);//    根据指定Section得到其下的所有Key和KeyValue//    返回Key的数目int              GetAllKeysAndValues(CString strSection,CStringArray& strArrKey,CStringArray& strArrKeyValue);//       删除所有Sectionvoid          DeleteAllSections();//初始化信息void initIniFile(LPCTSTR path);//获取指定ini中节中所有的valuevoid getValue(CString strPath, CString strSections);//返回vectorvector<CString>  getValueVctr();void getSysCurName(CString & strName);private://       ini文件路径CString m_strPath;vector<CString> m_valueVctr;};


MyIniClass.cpp文件

#include "stdafx.h"#include "MyIniClass.h"#define         MAX_SECTION                260        //Section最大长度#define         MAX_KEY                         260        //KeyValues最大长度#define         MAX_ALLSECTIONS     65535    //所有Section的最大长度#define         MAX_ALLKEYS              65535    //所有KeyValue的最大长度CMyIniClass::CMyIniClass() : m_valueVctr(NULL){}CMyIniClass::~CMyIniClass(){}////////////////////////////////////////////////////////////////////////////   Public Functions//////////////////////////////////////////////////////////////////////////BOOL CMyIniClass::SetPath(CString strPath){m_strPath = strPath;//       检查文件是否存在DWORD  dwFlag = GetFileAttributes((LPCTSTR)m_strPath);//       文件或者路径不存在,返回FALSEif (0xFFFFFFFF == dwFlag)return FALSE;//       路径是目录,返回FALSEif (FILE_ATTRIBUTE_DIRECTORY & dwFlag)return FALSE;return TRUE;}BOOL CMyIniClass::SectionExist(CString strSection){TCHAR chSection[MAX_SECTION];DWORD dwRetValue;dwRetValue = GetPrivateProfileString((LPCTSTR)strSection,NULL,_T(""),chSection,sizeof(chSection) / sizeof(TCHAR),(LPCTSTR)m_strPath);return (dwRetValue > 0);}CString CMyIniClass::GetKeyValue(CString strSection,CString strKey){TCHAR         chKey[MAX_KEY];DWORD         dwRetValue;CString strKeyValue = _T("");dwRetValue = GetPrivateProfileString((LPCTSTR)strSection,(LPCTSTR)strKey,_T(""),chKey,sizeof(chKey) / sizeof(TCHAR),(LPCTSTR)m_strPath);strKeyValue = chKey;return strKeyValue;}void CMyIniClass::SetKeyValue(CString strSection,CString strKey,CString strKeyValue){WritePrivateProfileString((LPCTSTR)strSection,(LPCTSTR)strKey,(LPCTSTR)strKeyValue,(LPCTSTR)m_strPath);}void CMyIniClass::DeleteKey(CString strSection, CString strKey){WritePrivateProfileString((LPCTSTR)strSection,(LPCTSTR)strKey,NULL,          //       这里写NULL,则删除Key(LPCTSTR)m_strPath);}void CMyIniClass::DeleteSection(CString strSection){WritePrivateProfileString((LPCTSTR)strSection,NULL,NULL,          //       这里都写NULL,则删除Section(LPCTSTR)m_strPath);}int CMyIniClass::GetAllSections(CStringArray& strArrSection){int dwRetValue, i, j, iPos = 0;TCHAR chAllSections[MAX_ALLSECTIONS];TCHAR chTempSection[MAX_SECTION];ZeroMemory(chAllSections, MAX_ALLSECTIONS);ZeroMemory(chTempSection, MAX_SECTION);dwRetValue = GetPrivateProfileSectionNames(chAllSections,MAX_ALLSECTIONS,m_strPath);//       因为Section在数组中的存放形式为“Section1”,0,“Section2”,0,0。//       所以如果检测到连续两个0,则breakfor (i = 0; i < MAX_ALLSECTIONS; i++){if (chAllSections[i] == NULL){if (chAllSections[i] == chAllSections[i + 1])break;}}i++; //         保证数据读完strArrSection.RemoveAll(); //         清空数组for (j = 0; j < i; j++){chTempSection[iPos++] = chAllSections[j];if (chAllSections[j] == NULL){strArrSection.Add(chTempSection);ZeroMemory(chTempSection, MAX_SECTION);iPos = 0;}}return strArrSection.GetSize();}int CMyIniClass::GetAllKeysAndValues(CString  strSection,CStringArray&         strArrKey,CStringArray& strArrKeyValue){int dwRetValue, i, j, iPos = 0;TCHAR chAllKeysAndValues[MAX_ALLKEYS];TCHAR chTempkeyAndValue[MAX_KEY];CString strTempKey;ZeroMemory(chAllKeysAndValues, MAX_ALLKEYS);ZeroMemory(chTempkeyAndValue, MAX_KEY);dwRetValue = GetPrivateProfileSection(strSection,chAllKeysAndValues,MAX_ALLKEYS,m_strPath);//       因为Section在数组中的存放形式为“Key1=KeyValue1”,0,“Key2=KeyValue2”,0//       所以如果检测到连续两个0,则breakfor (i = 0; i < MAX_ALLSECTIONS; i++){if (chAllKeysAndValues[i] == NULL){if (chAllKeysAndValues[i] == chAllKeysAndValues[i + 1])break;}}i++;strArrKey.RemoveAll();strArrKeyValue.RemoveAll();for (j = 0; j < i; j++){chTempkeyAndValue[iPos++] = chAllKeysAndValues[j];if (chAllKeysAndValues[j] == NULL){strTempKey = chTempkeyAndValue;strArrKey.Add(strTempKey.Left(strTempKey.Find('=')));strArrKeyValue.Add(strTempKey.Mid(strTempKey.Find('=') + 1));ZeroMemory(chTempkeyAndValue, MAX_KEY);iPos = 0;}}return strArrKey.GetSize();}void CMyIniClass::DeleteAllSections(){int nSecNum;CStringArray strArrSection;nSecNum = GetAllSections(strArrSection);for (int i = 0; i < nSecNum; i++){WritePrivateProfileString((LPCTSTR)strArrSection[i],NULL,NULL,(LPCTSTR)m_strPath);}}/************************************************************************//* 函数名称:getValue/* 函数功能:讲获取到的数据封装到成员变量vector中/* 参数1:ini文件路径/* 参数2:section名称/* 返回值:/* 说明:/************************************************************************/void CMyIniClass::getValue(CString strPath, CString strSections){CMyIniClass file;CStringArray arrSection, arrKey, arrkeyValue;//file.SetPath(L".\\myfile.ini");file.SetPath(strPath);CString str = L"";if (file.SectionExist(strSections)){// //得到所有section// int num = file.GetAllSections(arrSection);// str = "";// for (int i = 0; i < num; i++)// {// str += arrSection[i] + L" ";//str="student computer ";// }//得到所有Key和KeyValueint num = file.GetAllKeysAndValues(strSections, arrKey, arrkeyValue);str = L"";for (int j = 0; j < num; j++){//arrKey保存了computer下所有的Key//arrkeyValue保存了computer下所有的KeyValue//str = arrKey[j];str = arrkeyValue[j];m_valueVctr.push_back(str);}}}vector<CString> CMyIniClass::getValueVctr(){return m_valueVctr;}void CMyIniClass::initIniFile(LPCTSTR path){//::WritePrivateProfileStringW(_T("WINDOWS_DELETE"), _T("wintemp"), _T("c:\\windows\\temp"), _T(".\\myIni.ini"));//获取当前的系统登陆的用户名CString   strName;getSysCurName(strName);//拼接用户临时文件CString strUserTemp;strUserTemp.Format(_T("C:\\Users\\%s\\AppData\\Local\\Temp"), strName);//拼接浏览器历史记录CString strBroTemp;strBroTemp.Format(_T("C:\\Users\\%s\\AppData\\Local\\Microsoft\\Windows\\Temporary Internet Files"), strName);::WritePrivateProfileStringW(_T("WINDOWS_DELETE"), _T("wintemp"), _T("C:\\windows\\temp"), path);::WritePrivateProfileStringW(_T("WINDOWS_DELETE"), _T("usertemp"), strUserTemp, path);::WritePrivateProfileStringW(_T("BROWSER_DELETE"), _T("browsertemp"), strBroTemp, path);}/************************************************************************//* 函数名称:getSysCurName/* 函数功能: 获取当前登陆用户名/* 参数1:/* 参数2:/* 返回值:/* 说明:/************************************************************************/void CMyIniClass::getSysCurName(CString & strName){WCHAR UserName[MAX_PATH];//CString StrUserName;DWORD Size = MAX_PATH;::GetUserName(UserName, &Size);strName.Format(L"%s ", UserName);}


2、在mfc中的按钮事件中进行调用

//判断ini配置文件是否存在   不存在则创建CString path = _T(".\\myIni.ini");if (!m_IniFile.SectionExist(path)){m_IniFile.initIniFile(path);}

也可以使用如下进行测试

  void CMFCApplication1Dlg::OnBnClickedButton1(){      CIniFile file;         CStringArray arrSection, arrKey, arrkeyValue;         file.SetPath("f:\\ myfile.ini");         CString str="";          if(file.SectionExist("student"))         {                  //str="15"                   str = file.GetKeyValue("student", "female");                                     //设置number为50                  file.SetKeyValue("student", "number", "50");                    //因为在student中computer_num不存在,所以增加一项                  file.SetKeyValue("student", "computer_num", "30");                    //得到所有section                   int num = file.GetAllSections(arrSection);                   str = "";                   for(int i=0; i<num; i++)                   {                            str += arrSection[i] + " ";//str="student computer ";                   }                    //得到所有Key和KeyValue                   int num = file.GetAllKeysAndValues("computer", arrKey, arrkeyValue);                   str = "";                   for(int j=0; j<num; j++)                   {                            //arrKey保存了computer下所有的Key                            //arrkeyValue保存了computer下所有的KeyValue                            str = arrKey[j];                            str = arrkeyValue[j];                   }                   //删除student下的computer_num                  file.DeleteKey("student", "computer_num");                    //删除student                  file.DeleteSection("student");     } }



 
0 0
原创粉丝点击