CIniFile.cpp
上传用户:power_led
上传日期:2013-04-11
资源大小:373k
文件大小:6k
源码类别:

ICQ/即时通讯

开发平台:

Visual C++

  1. /*==================================================================
  2. =  文件名:CIniFile类实现文件                                       =
  3. =  修改日期:2002-12-28                                             = 
  4. =  作者:阿皮                                                       =  
  5. =   E_Mail:peijikui@sd365.com  msn:peijikui@sina.com                                                              = 
  6. ====================================================================*/
  7. #include "stdafx.h"
  8. #include "CIniFile.h"
  9. CIniFile::CIniFile():bFileExsit(FALSE)
  10. {
  11. }
  12. CIniFile::~CIniFile()
  13. {
  14. if(bFileExsit)
  15. {
  16. if(stfFile.Open(strInIFileName,CFile::modeCreate | CFile::modeWrite) && FileContainer.GetSize() > 0)
  17. {
  18. CString strParam;
  19. for(int i = 0; i< FileContainer.GetSize();i++)
  20. {
  21. strParam = FileContainer[i];
  22. // stfFile.WriteString(strParam);
  23. stfFile.WriteString(strParam+"n");
  24. }
  25. }
  26. stfFile.Close();
  27. }
  28. if(FileContainer.GetSize() > 0)
  29. {
  30. FileContainer.RemoveAll();
  31. }
  32. }
  33. /*
  34. BOOL  CIniFile::Create(const CString & strFileName)
  35. {
  36. bFileExsit = FALSE;
  37. strInIFileName = strFileName;
  38. if(!stfFile.Open(strFileName,CFile::modeRead))
  39. {
  40. return bFileExsit;
  41. }
  42. CString strFileLine;
  43. while(bFileExsit = stfFile.ReadString(strFileLine))
  44. {
  45. if(bFileExsit == FALSE)
  46. return bFileExsit;
  47. FileContainer.Add(strFileLine);
  48. }
  49. stfFile.Close();
  50. bFileExsit = TRUE;
  51. return bFileExsit;
  52. }*/
  53. BOOL  CIniFile::Create(const CString & strFileName)
  54. {
  55. bFileExsit = FALSE;
  56. strInIFileName = strFileName;
  57. if(!stfFile.Open(strFileName,CFile::modeRead))
  58. {
  59. return bFileExsit;
  60. }
  61. CString strFileLine;
  62. while(bFileExsit = stfFile.ReadString(strFileLine))
  63. {
  64. if(bFileExsit == FALSE)
  65. return bFileExsit;
  66. strFileLine.TrimLeft ();
  67. if( !strFileLine.IsEmpty () )
  68. FileContainer.Add(strFileLine);
  69. }
  70. stfFile.Close();
  71. bFileExsit = TRUE;
  72. return bFileExsit;
  73. }
  74. BOOL CIniFile::GetVar(const CString & strSection,const CString & strVarName,CString &strReturnValue)
  75. {
  76. if(bFileExsit == FALSE || FileContainer.GetSize() < 0)
  77. return bFileExsit;
  78. int iLine = SearchLine(strSection,strVarName);
  79. if(iLine > 0)
  80. {
  81. CString strParam = FileContainer[iLine -1];
  82.     strReturnValue = strParam.Mid(strParam.Find("=") + 1);
  83. return TRUE;
  84. }
  85. return FALSE;
  86. }
  87. BOOL CIniFile::GetVarStr(const CString & strSection,const CString & strVarName,CString &strReturnValue)
  88. {
  89. return(GetVar(strSection,strVarName,strReturnValue));
  90. }
  91. BOOL CIniFile::GetVarInt(const CString & strSection,const CString & strVarName,int & iValue)
  92. {
  93. CString  strReturnVar;
  94. if(GetVar(strSection,strVarName,strReturnVar))
  95. {
  96. strReturnVar.TrimLeft();
  97. int iLen = strReturnVar.GetLength();
  98. iValue = atoi(strReturnVar.GetBuffer(iLen));
  99. return TRUE;
  100. }
  101. return TRUE;
  102. }
  103. BOOL CIniFile::SetVar(const CString & strSection,const CString & strVarName,const CString & strVar,const int iType)
  104. {
  105. if(bFileExsit == FALSE )
  106. return bFileExsit;
  107. if(FileContainer.GetSize() == 0 && iType == 0)
  108. {
  109. FileContainer.Add("[" + strSection + "]");
  110. FileContainer.Add(strVarName + "=" + strVar);
  111. return TRUE;
  112. }
  113. int i = 0;
  114. int iFileLines = FileContainer.GetSize();
  115. //for(pInterator;pInterator != FileContainer.end();++pInterator)
  116. //{
  117. while(i< iFileLines)
  118. {
  119. CString strValue = FileContainer.GetAt(i++);
  120. strValue.TrimLeft();
  121. if((strValue.Find("[") >=0) && (strValue.Find(strSection) >=0))
  122. {
  123. while(i < iFileLines)
  124. {
  125. CString strSectionList = FileContainer[i++];
  126. strSectionList.TrimLeft();
  127. if(strSectionList.Find("//") >=0)//找到注释行
  128. continue;
  129. if(strSectionList.Find(strVarName)>=0)//找到
  130. {
  131. CString strParam = strVarName + "=" + strVar;
  132. //FileContainer.SetAt(i-1,strParam);
  133. FileContainer[i-1] = strParam;
  134. return TRUE;
  135. }
  136. if(strSectionList.Find("[",0)>=0)//在原来文件的SECTION中,没有相应的变量需要添加而且,这种情况下,下边还有别的section
  137. {
  138. //处理流程是这样的,首先把当前的数值依次向后移动,然后在当前位置加入新出现的数值
  139. if(iType !=0)
  140. return FALSE;
  141. CString strParam;
  142. FileContainer.Add(strParam);
  143. int iPre = FileContainer.GetSize()-1;
  144. while(iPre >= i)
  145. {
  146. CString strBehind = FileContainer[iPre -1];
  147. FileContainer[iPre] = strBehind;
  148. iPre --;
  149. }//*/
  150. strParam = strVarName + "=" + strVar;
  151. FileContainer.SetAt(i-1,strParam);
  152. return TRUE;
  153. }
  154. if(i == iFileLines && iType == 0)
  155. {
  156. FileContainer.Add(strVarName + "=" + strVar);
  157. return TRUE;
  158. }
  159. }
  160. }
  161. }
  162. if(iType == 0)
  163. {
  164. FileContainer.Add("[" + strSection + "]");
  165. FileContainer.Add(strVarName + "=" + strVar);
  166. }
  167. return TRUE;
  168. }
  169. BOOL CIniFile::SetVarStr(const CString & strSection,const CString & strVarName,const CString & strValue,const int iType)
  170. {
  171. return SetVar(strSection,strVarName,strValue,iType);
  172. }
  173. BOOL CIniFile::SetVarInt(const CString & strSection,const CString & strVarName,const int & iValue,const int iType)
  174. {
  175. CString strVar;
  176. strVar.Format("%d",iValue);
  177. return (SetVar(strSection,strVarName,strVar,iType));
  178. }
  179. int CIniFile::SearchLine(const CString & strSection,const CString & strVarName)
  180. {
  181. if(FileContainer.GetSize() > 0)
  182. {
  183. int i = 0;
  184. int iFileLines = FileContainer.GetSize();
  185. while(i< iFileLines)
  186. {
  187. CString strValue = FileContainer[i++];
  188. strValue.TrimLeft();
  189. if(strValue.Find("[") >=0 && strValue.Find(strSection,1)>=0)
  190. {
  191. while(i < iFileLines)
  192. {
  193. CString strSectionList = FileContainer[i++];
  194. strSectionList.TrimLeft();
  195. if(strSectionList.Find("//") >=0)//找到注释行
  196. continue;
  197. if(strSectionList.Find(strVarName)>=0)//找到
  198. {
  199. return i;
  200. }
  201. if(strSectionList.Find("[",0) >= 0)//另外一个段落出现,寻找失败
  202. {
  203. return -2;
  204. }
  205. }
  206. }
  207. }
  208. }
  209. return -1;
  210. }