stdafx.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. // stdafx.cpp : 只包括标准包含文件的源文件
  2. // UB530SDK.pch 将作为预编译头
  3. // stdafx.obj 将包含预编译类型信息
  4. #include "stdafx.h"
  5. #include <time.h> //或者 #include <ctime>
  6. #include <locale.h>
  7. // TODO: 在 STDAFX.H 中
  8. // 引用任何所需的附加头文件,而不是在此文件中引用
  9. // 全局变量;
  10. // 进程ID;
  11. DWORD g_dwAppId = 0;
  12. TCHAR g_szAppDir[MAX_PATH] = {0};
  13. // crc32校验;
  14. static int crc_table_empty = 1;
  15. static void make_crc_table (void);
  16. static const unsigned long crc_table[256] = {
  17. 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
  18. 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
  19. 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
  20. 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
  21. 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
  22. 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
  23. 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
  24. 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
  25. 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
  26. 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
  27. 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
  28. 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
  29. 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
  30. 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
  31. 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
  32. 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
  33. 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
  34. 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
  35. 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
  36. 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
  37. 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
  38. 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
  39. 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
  40. 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
  41. 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
  42. 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
  43. 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
  44. 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
  45. 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
  46. 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
  47. 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
  48. 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
  49. 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
  50. 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
  51. 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
  52. 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
  53. 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
  54. 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
  55. 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
  56. 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
  57. 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
  58. 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
  59. 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
  60. 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
  61. 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
  62. 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
  63. 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
  64. 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
  65. 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
  66. 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
  67. 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
  68. 0x2d02ef8dL
  69. };
  70. const unsigned long * get_crc_table()
  71. {
  72. return (const unsigned long *)crc_table;
  73. }
  74. /* ========================================================================= */
  75. #define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
  76. #define DO2(buf) DO1(buf); DO1(buf);
  77. #define DO4(buf) DO2(buf); DO2(buf);
  78. #define DO8(buf) DO4(buf); DO4(buf);
  79. /************************************************************************/
  80. /* 函数:[7/4/2018 Wang];
  81. /* 描述:crc32校验;
  82. /* 参数:;
  83. /* [IN] :;
  84. /* [OUT] :;
  85. /* [IN/OUT] :;
  86. /* 返回:void;
  87. /* 注意:;
  88. /* 示例:;
  89. /*
  90. /* 修改:;
  91. /* 日期:;
  92. /* 内容:;
  93. /************************************************************************/
  94. unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len)
  95. {
  96. if (buf == 0) return 0L;
  97. crc = crc ^ 0xffffffffUL;
  98. while (len >= 8)
  99. {
  100. DO8(buf);
  101. len -= 8;
  102. }
  103. if (len) do {
  104. DO1(buf);
  105. } while (--len);
  106. return crc ^ 0xffffffffUL;
  107. }
  108. /************************************************************************/
  109. /* 函数:[7/3/2018 Wang];
  110. /* 描述:提权函数;
  111. /* 参数:;
  112. /* [IN] :;
  113. /* [OUT] :;
  114. /* [IN/OUT] :;
  115. /* 返回:void;
  116. /* 注意:;
  117. /* 示例:;
  118. /*
  119. /* 修改:;
  120. /* 日期:;
  121. /* 内容:;
  122. /************************************************************************/
  123. BOOL GetDebugPriv()
  124. {
  125. // 返回的访问令牌指针;
  126. HANDLE hToken;
  127. // 接收所返回的制定特权名称的信息;
  128. LUID sedebugnameValue;
  129. // 新特权信息的指针(结构体);
  130. TOKEN_PRIVILEGES tkp;
  131. DWORD dwCurProcId = GetCurrentProcessId();
  132. // 要修改访问权限的进程句柄;
  133. HANDLE hCurProc;
  134. hCurProc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwCurProcId);
  135. if (!::OpenProcessToken(hCurProc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  136. {
  137. ShowSystemErrorInfo(_T("OpenProcessToken失败"),GetLastError());
  138. return FALSE;
  139. }
  140. if (!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
  141. {
  142. ShowSystemErrorInfo(_T("LookupPrivilegeValue失败"), GetLastError());
  143. CloseHandle(hToken);
  144. return FALSE;
  145. }
  146. tkp.PrivilegeCount = 1;
  147. tkp.Privileges[0].Luid = sedebugnameValue;
  148. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  149. if (!::AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))
  150. {
  151. ShowSystemErrorInfo(_T("升级包AdjustTokenPrivileges失败."), GetLastError());
  152. CloseHandle(hToken);
  153. return FALSE;
  154. }
  155. CloseHandle(hCurProc);
  156. CloseHandle(hToken);
  157. return TRUE;
  158. }
  159. /************************************************************************/
  160. /* 函数:[7/3/2018 Wang];
  161. /* 描述:;
  162. /* 参数:;
  163. /* [IN] :;
  164. /* [OUT] :;
  165. /* [IN/OUT] :;
  166. /* 返回:void;
  167. /* 注意:非线程安全;
  168. /* 示例:;
  169. /*
  170. /* 修改:;
  171. /* 日期:;
  172. /* 内容:;
  173. /************************************************************************/
  174. void ShowSystemErrorInfo( LPCTSTR lpszTitle,const DWORD &dwError)
  175. {
  176. LPVOID lpMsgBuf;
  177. static TCHAR szResult[MAX_PATH] = {0};
  178. memset(szResult, 0, sizeof(TCHAR)*MAX_PATH);
  179. BOOL fOk = FormatMessage(
  180. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  181. FORMAT_MESSAGE_FROM_SYSTEM |
  182. FORMAT_MESSAGE_IGNORE_INSERTS,
  183. NULL,
  184. dwError,
  185. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  186. (LPTSTR)&lpMsgBuf,
  187. 0, NULL);
  188. if (!fOk)
  189. {
  190. // Is it a network-related error?
  191. HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES);
  192. if (hDll != NULL)
  193. {
  194. FormatMessage(
  195. FORMAT_MESSAGE_FROM_HMODULE |
  196. FORMAT_MESSAGE_FROM_SYSTEM |
  197. FORMAT_MESSAGE_IGNORE_INSERTS,
  198. hDll,
  199. dwError,
  200. MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  201. (LPTSTR)&lpMsgBuf,
  202. 0,
  203. NULL);
  204. FreeLibrary(hDll);
  205. }
  206. }
  207. if (lpMsgBuf != NULL)
  208. {
  209. _stprintf_s(szResult, _T("%s:%ld,%s"), lpszTitle == NULL ? _T("错误") : lpszTitle, dwError, (PCTSTR)LocalLock(lpMsgBuf));
  210. WriteTextLog(szResult);
  211. LocalFree(lpMsgBuf);
  212. }
  213. else
  214. {
  215. _stprintf_s(szResult, _T("%s:未知错误!"),lpszTitle == NULL ? _T("错误") : lpszTitle);
  216. WriteTextLog(szResult);
  217. }
  218. }
  219. /************************************************************************/
  220. /* 函数:[7/3/2018 Wang];
  221. /* 描述:进程是否在运行;
  222. /* 参数:;
  223. /* [IN] lpszAppDir:执行程序绝对路径;
  224. /* 返回:若进程存在,返回非0值;
  225. /* 注意:;
  226. /* 示例:;
  227. /*
  228. /* 修改:;
  229. /* 日期:;
  230. /* 内容:;
  231. /************************************************************************/
  232. DWORD IsAppRunning(LPCTSTR lpszAppDir)
  233. {
  234. if (!lpszAppDir || !PathFileExists(lpszAppDir))
  235. return 0;
  236. TString strAppDir = lpszAppDir;
  237. int nIndex =strAppDir.find('/');
  238. while (nIndex != TString::npos)
  239. {
  240. strAppDir.replace(nIndex, 1, _T("\\"));
  241. nIndex = strAppDir.find('/');
  242. }
  243. nIndex = strAppDir.find_last_of(_T('\\'));
  244. if (nIndex != TString::npos )
  245. strAppDir = strAppDir.substr(nIndex+1);
  246. DWORD dwProcessID = 0;
  247. PROCESSENTRY32 pe32 = { 0 };
  248. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  249. if (hProcessSnap == NULL)
  250. {
  251. ShowSystemErrorInfo(_T("获取进程快照失败"),GetLastError());
  252. return 0;
  253. }
  254. pe32.dwSize = sizeof(PROCESSENTRY32);
  255. if (Process32First(hProcessSnap, &pe32))
  256. {
  257. do
  258. {
  259. // szExeFile只是文件名,不知道是否只有win10才这样;
  260. if (_tcsicmp(strAppDir.c_str(), pe32.szExeFile) == 0)
  261. {
  262. dwProcessID = pe32.th32ProcessID;
  263. break;
  264. }
  265. } while (Process32Next(hProcessSnap, &pe32));
  266. }
  267. CloseHandle(hProcessSnap);
  268. return dwProcessID;
  269. }
  270. /************************************************************************/
  271. /* 函数:[7/3/2018 Wang];
  272. /* 描述:关闭进程;
  273. /* 参数:;
  274. /* [IN] dwAppId:进程ID;
  275. /* 返回:void;
  276. /* 注意:;
  277. /* 示例:;
  278. /*
  279. /* 修改:;
  280. /* 日期:;
  281. /* 内容:;
  282. /************************************************************************/
  283. bool CloseApp(DWORD dwAppId)
  284. {
  285. if ( dwAppId == 0 )
  286. return false;
  287. HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwAppId);
  288. if (hProcess == NULL)
  289. {
  290. ShowSystemErrorInfo(_T("打开进程失败"),GetLastError());
  291. return false;
  292. }
  293. DWORD dwError;
  294. if (!TerminateProcess(hProcess, 0))
  295. {
  296. dwError = GetLastError();
  297. CloseHandle(hProcess);
  298. hProcess = NULL;
  299. return false;
  300. }
  301. // 等待进程结束响应;
  302. if (WAIT_OBJECT_0 != WaitForSingleObject(hProcess, INFINITE))
  303. {
  304. CloseHandle(hProcess);
  305. return false;
  306. }
  307. CloseHandle(hProcess);
  308. hProcess = NULL;
  309. return true;
  310. }
  311. /************************************************************************/
  312. /* 函数:WriteTextLog[7/28/2016 IT];
  313. /* 描述:写文本日志;
  314. /* 参数:;
  315. /* [IN] :;
  316. /* 返回:void;
  317. /* 注意:;
  318. /* 示例:;
  319. /*
  320. /* 修改:;
  321. /* 日期:;
  322. /* 内容:;
  323. /************************************************************************/
  324. void WriteTextLog(const TCHAR *format, ...)
  325. {
  326. //static ThreadSection _critSection;
  327. //AutoThreadSection aSection(&_critSection);
  328. // 解析出日志路径;
  329. TCHAR szlogpath[MAX_PATH] = {0};
  330. static TCHAR szModulePath[MAX_PATH] = {0};
  331. static TCHAR szFna[_MAX_DIR] = { 0 };
  332. if ( szModulePath[0] == _T('\0') )
  333. {
  334. TCHAR szDrive[_MAX_DRIVE] = { 0 };
  335. TCHAR szDir[_MAX_DIR] = { 0 };
  336. TCHAR szExt[_MAX_DIR] = { 0 };
  337. ::GetModuleFileName(NULL, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
  338. _tsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
  339. _tcscpy_s(szModulePath, szDrive);
  340. _tcscat_s(szModulePath, szDir);
  341. }
  342. // 获取今年年份;
  343. __time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
  344. struct tm gmtm = {0};
  345. //gmtime_s(&gmtm, &gmt); // 时间戳转成UTC时间(也叫GMT时间);
  346. localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
  347. _stprintf_s(szlogpath, _T("%s%s%04d-%02d-%02d.txt"), szModulePath, szFna, gmtm.tm_year + 1900, gmtm.tm_mon+1, gmtm.tm_mday);
  348. // 打开或创建文件;
  349. #if 0 // MFC
  350. CStdioFile fp;
  351. if (PathFileExists(szlogpath))
  352. {
  353. if (fp.Open(szlogpath, CFile::modeWrite) == FALSE)
  354. {
  355. return;
  356. }
  357. fp.SeekToEnd();
  358. }
  359. else
  360. {
  361. fp.Open(szlogpath, CFile::modeCreate | CFile::modeWrite);
  362. }
  363. // 格式化前设置语言区域;
  364. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  365. _tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
  366. // 格式化日志内容;
  367. va_list args = NULL;
  368. int len = 0;
  369. TCHAR *buffer = NULL;
  370. va_start( args, format );
  371. // _vscprintf doesn't count. terminating '\0'
  372. len = _vsctprintf( format, args ) + 1;
  373. buffer = (TCHAR*)malloc( len * sizeof(TCHAR) );
  374. _vstprintf_s( buffer, len, format, args ); // C4996
  375. // Note: vsprintf is deprecated; consider using vsprintf_s instead
  376. // 将日志内容输入到文件中;
  377. fp.WriteString( CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S ")) );
  378. fp.WriteString(buffer);
  379. fp.WriteString(_T("\n"));
  380. // 关闭文件,释放资源并设置回原语言区域;
  381. free( buffer );
  382. _tsetlocale(LC_CTYPE, old_locale);
  383. free(old_locale);//还原区域设定;
  384. fp.Close();
  385. #else // 不依赖MFC;
  386. FILE *fp = NULL;
  387. fp = _tfopen(szlogpath, _T("a+"));
  388. if ( fp == NULL )
  389. return;
  390. fseek(fp, 0, SEEK_END);
  391. // 格式化前设置语言区域;
  392. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  393. _tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
  394. // 格式化日志内容;
  395. va_list args = NULL;
  396. int len = 0;
  397. TCHAR *buffer = NULL;
  398. va_start( args, format );
  399. // _vscprintf doesn't count. terminating '\0'
  400. len = _vsctprintf( format, args ) + 1;
  401. buffer = (TCHAR*)malloc( len * sizeof(TCHAR) );
  402. _vstprintf_s( buffer, len, format, args ); // C4996
  403. // Note: vsprintf is deprecated; consider using vsprintf_s instead
  404. // 将日志内容输入到文件中;
  405. TCHAR szTime[36] = {0};
  406. _stprintf_s(szTime, _T("%04d-%02d-%02d %02d:%02d:%02d "), gmtm.tm_year + 1900, gmtm.tm_mon+1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec);
  407. fwrite(szTime, _tcslen(szTime)*sizeof(TCHAR), 1, fp);
  408. fwrite(buffer, _tcslen(buffer)*sizeof(TCHAR), 1, fp);
  409. fwrite(_T("\n"), sizeof(TCHAR), 1, fp);
  410. // 关闭文件,释放资源并设置回原语言区域;
  411. free( buffer );
  412. _tsetlocale(LC_CTYPE, old_locale);
  413. free(old_locale);//还原区域设定;
  414. fclose(fp);
  415. #endif
  416. }
  417. /************************************************************************/
  418. /* 函数:[8/13/2018 jianfeng1.wang];
  419. /* 描述:;
  420. /* 参数:;
  421. /* [IN] :;
  422. /* [OUT] :;
  423. /* [IN/OUT] :;
  424. /* 返回:void;
  425. /* 注意:;
  426. /* 示例:;
  427. /*
  428. /* 修改:;
  429. /* 日期:;
  430. /* 内容:;
  431. /************************************************************************/
  432. void findfile(IN CONST TString& folder, IN vector<TString> &files)
  433. {
  434. TString path = folder;
  435. if (path.size() > 0 && '\\' != path[path.size() - 1])
  436. path.append(_T("\\"));
  437. TString file = _T("*");
  438. TString s = path + file;
  439. WIN32_FIND_DATA fileinfo = { 0 };
  440. HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
  441. if (NULL != handle && INVALID_HANDLE_VALUE != handle)
  442. {
  443. do
  444. {
  445. // '.'和 '..'的系统文件去除;
  446. if (_T('.') != fileinfo.cFileName[0])
  447. {
  448. if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY) // 目录;
  449. {
  450. findfile(path + fileinfo.cFileName, files);
  451. }
  452. else
  453. {
  454. files.push_back(path + fileinfo.cFileName);
  455. }
  456. }
  457. } while (FindNextFile(handle, &fileinfo));
  458. FindClose(handle);
  459. }
  460. }