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. //iType == 1时,说明,这个文件不存在就创建,如果不为1则退出
  34. BOOL  CIniFile::Create(const CString & strFileName,const int iType )
  35. {
  36. bFileExsit = FALSE;
  37. strInIFileName = strFileName;
  38. if(!stfFile.Open(strFileName,CFile::modeRead))
  39. {
  40. if( iType != 1 )
  41. {
  42. return bFileExsit;
  43. }
  44. else
  45. {
  46. if(!stfFile.Open(strFileName,CFile::modeCreate))
  47. {
  48. return bFileExsit;
  49. }
  50. }
  51. }
  52. CString strFileLine;
  53. while(bFileExsit = stfFile.ReadString(strFileLine))
  54. {
  55. if(bFileExsit == FALSE)
  56. return bFileExsit;
  57. strFileLine.TrimLeft ();
  58. if( !strFileLine.IsEmpty () )
  59. FileContainer.Add(strFileLine);
  60. }
  61. stfFile.Close();
  62. bFileExsit = TRUE;
  63. return bFileExsit;
  64. }
  65. BOOL CIniFile::GetVar(const CString & strSection,const CString & strVarName,CString &strReturnValue)
  66. {
  67. if(bFileExsit == FALSE || FileContainer.GetSize() < 0)
  68. return bFileExsit;
  69. int iLine = SearchLine(strSection,strVarName);
  70. if(iLine > 0)
  71. {
  72. CString strParam = FileContainer[iLine -1];
  73.     strReturnValue = strParam.Mid(strParam.Find(_T("=")) + 1);
  74. return TRUE;
  75. }
  76. return FALSE;
  77. }
  78. BOOL CIniFile::GetVarStr(const CString & strSection,const CString & strVarName,CString &strReturnValue)
  79. {
  80. return(GetVar(strSection,strVarName,strReturnValue));
  81. }
  82. BOOL CIniFile::GetVarInt(const CString & strSection,const CString & strVarName,int & iValue)
  83. {
  84. CString  strReturnVar;
  85. if(GetVar(strSection,strVarName,strReturnVar))
  86. {
  87. strReturnVar.TrimLeft();
  88. int iLen = strReturnVar.GetLength();
  89. iValue = atoi(strReturnVar.GetBuffer(iLen));
  90. return TRUE;
  91. }
  92. else
  93. return FALSE;
  94. return TRUE;
  95. }
  96. BOOL CIniFile::SetVar(const CString & strSection,const CString & strVarName,const CString & strVar,const int iType)
  97. {
  98. if(bFileExsit == FALSE )
  99. return bFileExsit;
  100. if(FileContainer.GetSize() == 0 && iType == 0)
  101. {
  102. FileContainer.Add("[" + strSection + "]");
  103. FileContainer.Add(strVarName + "=" + strVar);
  104. return TRUE;
  105. }
  106. int i = 0;
  107. int iFileLines = FileContainer.GetSize();
  108. //for(pInterator;pInterator != FileContainer.end();++pInterator)
  109. //{
  110. while(i< iFileLines)
  111. {
  112. CString strValue = FileContainer.GetAt(i++);
  113. strValue.TrimLeft();
  114. if((strValue.Find("[") >=0) && (strValue.Find(strSection) >=0))
  115. {
  116. while(i < iFileLines)
  117. {
  118. CString strSectionList = FileContainer[i++];
  119. strSectionList.TrimLeft();
  120. if(strSectionList.Find("//") >=0)//找到注释行
  121. continue;
  122. if(strSectionList.Find(strVarName)>=0)//找到
  123. {
  124. CString strParam = strVarName + "=" + strVar;
  125. //FileContainer.SetAt(i-1,strParam);
  126. FileContainer[i-1] = strParam;
  127. return TRUE;
  128. }
  129. if(strSectionList.Find("[",0)>=0)//在原来文件的SECTION中,没有相应的变量需要添加而且,这种情况下,下边还有别的section
  130. {
  131. //处理流程是这样的,首先把当前的数值依次向后移动,然后在当前位置加入新出现的数值
  132. if(iType !=0)
  133. return FALSE;
  134. CString strParam;
  135. FileContainer.Add(strParam);
  136. int iPre = FileContainer.GetSize()-1;
  137. while(iPre >= i)
  138. {
  139. CString strBehind = FileContainer[iPre -1];
  140. FileContainer[iPre] = strBehind;
  141. iPre --;
  142. }//*/
  143. strParam = strVarName + "=" + strVar;
  144. FileContainer.SetAt(i-1,strParam);
  145. return TRUE;
  146. }
  147. if(i == iFileLines && iType == 0)
  148. {
  149. FileContainer.Add(strVarName + "=" + strVar);
  150. return TRUE;
  151. }
  152. }
  153. }
  154. }
  155. if(iType == 0)
  156. {
  157. FileContainer.Add("[" + strSection + "]");
  158. FileContainer.Add(strVarName + "=" + strVar);
  159. }
  160. return TRUE;
  161. }
  162. BOOL CIniFile::SetVarStr(const CString & strSection,const CString & strVarName,const CString & strValue,const int iType)
  163. {
  164. return SetVar(strSection,strVarName,strValue,iType);
  165. }
  166. BOOL CIniFile::SetVarInt(const CString & strSection,const CString & strVarName,const int & iValue,const int iType)
  167. {
  168. CString strVar;
  169. strVar.Format("%d",iValue);
  170. return (SetVar(strSection,strVarName,strVar,iType));
  171. }
  172. int CIniFile::SearchLine(const CString & strSection,const CString & strVarName)
  173. {
  174. if(FileContainer.GetSize() > 0)
  175. {
  176. int i = 0;
  177. int iFileLines = FileContainer.GetSize();
  178. while(i< iFileLines)
  179. {
  180. CString strValue = FileContainer[i++];
  181. strValue.TrimLeft();
  182. if(strValue.Find("[") >=0 && strValue.Find(strSection,1)>=0)
  183. {
  184. while(i < iFileLines)
  185. {
  186. CString strSectionList = FileContainer[i++];
  187. strSectionList.TrimLeft();
  188. if(strSectionList.Find("//") >=0)//找到注释行
  189. continue;
  190. if(strSectionList.Find(strVarName)>=0)//找到
  191. {
  192. return i;
  193. }
  194. if(strSectionList.Find("[",0) >= 0)//另外一个段落出现,寻找失败
  195. {
  196. return -2;
  197. }
  198. }
  199. }
  200. }
  201. }
  202. return -1;
  203. }