1 #include "StdAfx.h" 2 #include "CIMFile.h" 3 #include "Markup.h" 4 5 #ifdef UNICODE 6 #define _tcout(x) std::wcout << x; 7 #else 8 #define _tcout(x) std::cout << x; 9 #endif 10 11 char* Wide2Byte(const TCHAR* pWide) 12 { 13 char *pBytes = NULL; 14 int nLen = WideCharToMultiByte(CP_ACP,0,pWide,-1,NULL,0,NULL,NULL); 15 // get need convert length 16 int i = (int)wcslen(pWide)*sizeof(TCHAR); 17 // get need new memory size 18 pBytes = new char[i+1]; 19 if (!pBytes) // if fail then new again 20 { 21 pBytes = new char[i+1]; 22 } 23 WideCharToMultiByte(CP_ACP,0,pWide,-1,pBytes,nLen,NULL,NULL); 24 pBytes[nLen]='\0'; 25 26 return pBytes; 27 } 28 29 TCHAR* Byte2Wide(const char* pBytes) 30 { 31 TCHAR *pWide = NULL; 32 33 int nLen = MultiByteToWideChar(CP_ACP,0,pBytes,strlen(pBytes),NULL,0); 34 pWide = new wchar_t[nLen+1]; 35 if (!pWide) // if fail then new again 36 { 37 pWide = new TCHAR[nLen+1]; 38 } 39 MultiByteToWideChar(CP_ACP,0,pBytes,strlen(pBytes),pWide,nLen); 40 pWide[nLen]='\0'; 41 42 return pWide; 43 } 44 45 void _FindDirFiles(tstring dirPath, tstring suffix, vector<tstring> &files) 46 { 47 TCHAR *_dirPath = new TCHAR[MAX_PATH]; 48 int len = dirPath.length() + 4; 49 _tcscpy_s(_dirPath, len, dirPath.c_str()); 50 _tcscat_s(_dirPath, len, _T("*.*")); 51 52 _finddata_t file; 53 54 char *pdirPath = Wide2Byte(_dirPath); 55 56 long lf; 57 if((lf = _findfirst(pdirPath, &file))==-1l) 58 cout<<"文件没有找到!\n"; 59 else 60 { 61 files.clear(); 62 while( _findnext( lf, &file ) == 0 ) 63 { 64 TCHAR *pName = Byte2Wide(file.name); 65 tstring str(pName); 66 int te = str.find(suffix); 67 if(te != -1){ 68 //cout<<file.name<<endl; 69 files.push_back(str); 70 } 71 if(file.attrib == _A_NORMAL)cout<<" 普通文件 "; 72 else if(file.attrib == _A_RDONLY)cout<<" 只读文件 "; 73 else if(file.attrib == _A_HIDDEN )cout<<" 隐藏文件 "; 74 else if(file.attrib == _A_SYSTEM )cout<<" 系统文件 "; 75 else if(file.attrib == _A_SUBDIR){ 76 77 if(strcmp(file.name,"..")==0 || strcmp(file.name,".svn")==0){} 78 } 79 80 delete[] pName; 81 } 82 } 83 delete[] pdirPath; 84 delete[] _dirPath; 85 86 _findclose(lf); 87 88 } 89 90 void FindDirFiles(string dirPath, string suffix, vector<string> &files) 91 { 92 char *pchar = new char[MAX_PATH]; 93 int len = dirPath.length() + 4; 94 strcpy_s(pchar, len, dirPath.c_str()); 95 strcat_s(pchar, len, "*.*"); 96 97 _finddata_t file; 98 99 long lf; 100 if((lf = _findfirst(pchar, &file))==-1l) 101 cout<<"文件没有找到!\n"; 102 else 103 { 104 files.clear(); 105 while( _findnext( lf, &file ) == 0 ) 106 { 107 108 string str(file.name); 109 int te = str.find(suffix.c_str()); 110 if(te != -1){ 111 //cout<<file.name<<endl; 112 files.push_back(str); 113 } 114 if(file.attrib == _A_NORMAL)cout<<" 普通文件 "; 115 else if(file.attrib == _A_RDONLY)cout<<" 只读文件 "; 116 else if(file.attrib == _A_HIDDEN )cout<<" 隐藏文件 "; 117 else if(file.attrib == _A_SYSTEM )cout<<" 系统文件 "; 118 else if(file.attrib == _A_SUBDIR){ 119 120 if(strcmp(file.name,"..")==0 || strcmp(file.name,".svn")==0){} 121 } 122 } 123 } 124 delete[] pchar; 125 126 _findclose(lf); 127 128 } 129 130 CCIMFile::CCIMFile(void) : 131 m_arSubstation(10000) 132 , m_arPDLoadSWDet(10000) 133 { 134 m_pXML = new CMarkup(); 135 } 136 137 CCIMFile::~CCIMFile(void) 138 { 139 CleanMem(); 140 DELETE_POINTER(m_pXML); 141 } 142 143 void CCIMFile::CleanMem() 144 { 145 m_arSubstation.ReleaseAll(); 146 m_arSWGear.ReleaseAll(); 147 m_arPDRoom.ReleaseAll(); 148 m_arPDSite.ReleaseAll(); 149 m_arPDHVLine.ReleaseAll(); 150 m_arPDLeadLineDet.ReleaseAll(); 151 m_arPDMainBusDet.ReleaseAll(); 152 m_arPDBreaker.ReleaseAll(); 153 m_arPDSwitch.ReleaseAll(); 154 m_arPDSubSWDet.ReleaseAll(); 155 m_arPDLoadSW.ReleaseAll(); 156 m_arPDLoadSWDet.ReleaseAll(); 157 m_arPDFusePR.ReleaseAll(); 158 m_arPDFuse.ReleaseAll(); 159 m_arPDTran.ReleaseAll(); 160 m_arPDXFmrDet.ReleaseAll(); 161 162 //DeleteMap(&mpTbl); 163 mpTbl.clear(); 164 165 } 166 167 BOOL CCIMFile::ParseDir(LPCTSTR strDir) 168 { 169 CleanMem(); 170 171 tstring suffix = _T(".xml"); 172 vector<tstring> files; 173 _FindDirFiles(strDir, suffix, files); 174 int num = files.size(); 175 cout << " 文件总数:" << num << endl << endl; 176 177 for (int i = 0; i < (int)files.size(); i++) 178 { 179 tstring filePath = strDir + files[i]; 180 int nLen = files[i].length(); 181 TCHAR *strTemp = new TCHAR[nLen + 1]; 182 _tcscpy_s(strTemp, nLen + 1, files[i].c_str()); 183 wcstok(strTemp, _T("_")); 184 CIM_NODE::nParseTblId = _ttoi(wcstok(NULL, _T("_"))); 185 DELETE_POINTER(strTemp); 186 187 wcout << " ["<< i << "/" << num << "] 正在解析:" << files[i].c_str(); 188 ParseFile(filePath.c_str()); 189 } 190 191 wcout << " 解析完毕!" << endl; 192 193 return TRUE; 194 } 195 196 BOOL CCIMFile::ParseFile(LPCTSTR strFilePath) 197 { 198 //string path = "D:\\iStudio\\svn\\SZ_REVA\\PowerES\\prog\\data\\GISCIM\\"; 199 200 int numsOfPSR = 0; 201 202 if(!m_pXML->Load((MCD_CSTR)strFilePath)) 203 return FALSE; 204 205 switch (CIM_NODE::nParseTblId) 206 { 207 case 76: // CIM_DIST_LOADSWITCHDET 208 { 209 m_pXML->ResetMainPos(); 210 CIM_NODE::strParseTblName = CIM_DIST_LOADSWITCHDET::strTblName; 211 while (m_pXML->FindChildElem(MCD_CSTR(_T("cim:") + CIM_DIST_LOADSWITCHDET::strTblName))) 212 { 213 CIM_DIST_LOADSWITCHDET *pNode = m_arPDLoadSWDet.AddItem(); 214 pNode->Parse(m_pXML); 215 216 mpNode.insert(pair<int, CIM_NODE *>(pNode->nID, pNode)); 217 mpTbl.insert(pair<int, CIM_NODE *>(CIM_NODE::nParseTblId, pNode)); 218 219 numsOfPSR++; 220 } 221 222 } 223 break; 224 } 225 226 wcout << "\t 新增解析对象个数:" << numsOfPSR << " ,共 " << mpNode.size() << "个" << endl << endl; 227 228 return TRUE; 229 }