PublicFunction.cpp
上传用户:oadesign
上传日期:2013-12-25
资源大小:265k
文件大小:36k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // PublicFunction.cpp: implementation of the CPublicFunction class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "NetDownMTR.h"
  6. #include "PublicFunction.h"
  7. #include <Afxmt.h>
  8. #include  <io.h>
  9. #include <direct.h>
  10. // for function StrTrim()
  11. #include "Shlwapi.h"
  12. #pragma comment ( lib, "Shlwapi.lib" )
  13. #ifdef _DEBUG
  14. #undef THIS_FILE
  15. static char THIS_FILE[]=__FILE__;
  16. #define new DEBUG_NEW
  17. #endif
  18. const char f_seps[]   = ";";
  19. void DeleteStrAry(CStringArray **ppStrAry)
  20. {
  21. if ( ppStrAry && (*ppStrAry) )
  22. {
  23. (*ppStrAry)->RemoveAll();
  24. (*ppStrAry)->FreeExtra();
  25. delete (*ppStrAry);
  26. (*ppStrAry) = NULL;
  27. }
  28. }
  29. int PartStringAndAddToStrAry ( char *pStr, CStringArray &StrAry, char *seps/*="trn"*/ )
  30. {
  31. StrAry.RemoveAll();
  32. char *token;
  33. token = strtok( pStr, seps );
  34. while( token != NULL )
  35. {
  36. /* While there are tokens in "string" */
  37. StrAry.Add ( token );
  38. /* Get next token: */
  39. token = strtok( NULL, seps );
  40. }
  41. return StrAry.GetSize();
  42. }
  43. int PartStringAndAddToStrAry ( char *pStr, CStringArray &StrAry, char nPartFlag )
  44. {
  45. char *pStart = pStr;
  46. char *pFind = NULL;
  47. char szTempBuf[10240] = {0};
  48. LPCTSTR pszTrimChars = "rnt";
  49. while ( pFind = strchr ( pStart, nPartFlag ) )
  50. {
  51. int nLen = pFind - pStart;
  52. if ( nLen > 0 )
  53. {
  54. if ( nLen > sizeof(szTempBuf)-2 )
  55. nLen = sizeof(szTempBuf)-2;
  56. memcpy ( szTempBuf, pStart, nLen );
  57. szTempBuf [ nLen ] = '';
  58. StrTrim ( szTempBuf, pszTrimChars );
  59. StrAry.Add ( szTempBuf );
  60. }
  61. else
  62. {
  63. StrAry.Add ( "" );
  64. }
  65. pStart = pFind + 1;
  66. }
  67. if ( (int)( pStart - pStr ) < (int)strlen ( pStr ) )
  68. StrAry.Add ( pStart );
  69. return StrAry.GetSize();
  70. }
  71. int PartStringAndAddToStrAry ( LPCTSTR lpszStr, CStringArray &StrAry, char nFirstFlag, char nSecondFlag )
  72. {
  73. StrAry.RemoveAll();
  74. int nStartPos = 0, nEndPos = 0;
  75. CString csBigString = GET_SAFE_STRING ( lpszStr );
  76. BOOL bSentence = FALSE;
  77. for ( ;; )
  78. {
  79. char cFindChar = ( bSentence ? nSecondFlag : nFirstFlag );
  80. int nFindPos = csBigString.Find ( cFindChar, nEndPos );
  81. if ( nFindPos < 0 )
  82. {
  83. if ( bSentence )
  84. {
  85. CString csTemp = csBigString.Mid ( nStartPos+1 );
  86. if ( csTemp.GetLength() > 0 )
  87. StrAry.Add ( csTemp );
  88. }
  89. break;
  90. }
  91. if ( !bSentence )
  92. {
  93. nStartPos = nFindPos;
  94. bSentence = TRUE;
  95. }
  96. else
  97. {
  98. nEndPos = nFindPos;
  99. CString csTemp = csBigString.Mid ( nStartPos+1, nEndPos-nStartPos-1 );
  100. StrAry.Add ( csTemp );
  101. bSentence = FALSE;
  102. }
  103. nEndPos = nFindPos + 1;
  104. }
  105. return StrAry.GetSize();
  106. }
  107. //////////////////////////////////////////////////////////////////////
  108. // Construction/Destruction
  109. //////////////////////////////////////////////////////////////////////
  110. CHwDir::CHwDir(
  111. LPCTSTR lpszBasePathOrFile,
  112. BOOL bSerachSubDir/* = TRUE*/, // 搜索子目录
  113. BOOL bAbsolutePath /*=TRUE*/, // 是绝对路径
  114. CHwDir **ppHwDir/*=NULL*/ // 将这个类的指针传出去给调用者
  115. )
  116. {
  117. m_bCancel = FALSE;
  118. if ( ppHwDir ) *ppHwDir = this;
  119. m_pStrAryResFile = new CStringArray;
  120. if ( !m_pStrAryResFile ) return;
  121. m_pStrArySubDirectory_Private = new CStringArray;
  122. if ( !m_pStrArySubDirectory_Private ) return;
  123. m_pStrArySubDirectory = new CStringArray;
  124. if ( !m_pStrArySubDirectory ) return;
  125. //初始化变量
  126. char buf[MAX_PATH];
  127. m_bSerachSubDir = bSerachSubDir;
  128. m_bAbsolutePath = bAbsolutePath;
  129. m_pStrAryResFile->FreeExtra();
  130. m_pStrArySubDirectory_Private->FreeExtra();
  131. m_pStrArySubDirectory->FreeExtra();
  132. m_dwRelativePathStartPos = 0;
  133. ZeroMemory(m_szBasePathFile,sizeof(m_szBasePathFile));
  134. int iLen = 0;
  135. char *p = NULL;
  136. ZeroMemory(m_strFilter,sizeof(m_strFilter));
  137. m_AmountBytes = 0;
  138. iLen = hwSnprintf((char*)m_szBasePathFile,sizeof(m_szBasePathFile)-2,"%s",lpszBasePathOrFile);
  139. //查找的是目录还是文件,取得目录名和过滤字符(*.*、*.exe、??.cpp等都是过滤条件)
  140. char TempBuf[MAX_PATH];
  141. ZeroMemory(TempBuf,sizeof(TempBuf));
  142. DWORD dwFileAttrib = GetFileAttributes(m_szBasePathFile);
  143. if((dwFileAttrib & FILE_ATTRIBUTE_DIRECTORY) && dwFileAttrib != 0xffffffff) //指定搜索一个目录,没有过滤条件
  144. {
  145. strcpy(m_strFilter,"*.*");
  146. if(m_szBasePathFile[iLen - 1] != '\')
  147. m_szBasePathFile[iLen] = '\';
  148. }
  149. else //指定了过滤条件
  150. {
  151. PartFileAndPathByFullPath(m_szBasePathFile,m_strFilter,sizeof(m_strFilter),TempBuf,sizeof(TempBuf));
  152. STRNCPY_SZ( m_szBasePathFile, TempBuf );
  153. }
  154. //找相对路径的位置
  155. if ( !bAbsolutePath )
  156. {
  157. strcpy((char*)buf,(const char*)m_szBasePathFile);
  158. if ( strchr((const char*)buf,':') && strlen((const char*)buf) == 3 ) //是诸如“E:”、“d:”的路径
  159. {
  160. m_dwRelativePathStartPos = 3;
  161. }
  162. else if ( strlen((const char*)buf) == 1 && buf[0] == '\') //是“”,表示搜索当前盘的根目录
  163. {
  164. m_dwRelativePathStartPos = 1;
  165. }
  166. else //一般目录(绝对路径、相对路径)
  167. {
  168. iLen = (int)strlen((const char*)buf);
  169. buf[iLen - 1] = '';
  170. p = strrchr((const char*)buf,'\');
  171. if(p)
  172. {
  173. m_dwRelativePathStartPos = (DWORD)(p - buf + 1);
  174. }
  175. }
  176. }
  177. Dir();
  178. }
  179. CHwDir::~CHwDir()
  180. {
  181. DeleteStrAry ( &m_pStrAryResFile );
  182. DeleteStrAry ( &m_pStrArySubDirectory_Private );
  183. DeleteStrAry ( &m_pStrArySubDirectory );
  184. }
  185. /********************************************************************************
  186. * Function Type : private
  187. * Parameter : None
  188. * Return Value : 获得的文件总数
  189. * Description : 将目录m_szBasePathFile下的所有文件列举出来
  190. *********************************************************************************/
  191. DWORD CHwDir::Dir()
  192. {
  193. char strDirectory[MAX_PATH*4];
  194. DWORD dwLine = 0;
  195. FindDirAndFile(m_szBasePathFile);
  196. while(1)
  197. {
  198. dwLine = (DWORD)m_pStrArySubDirectory_Private->GetSize();
  199. if(dwLine < 1) break;
  200. //处理m_StrArySubDirectory中最后一个子目录
  201. hwSnprintf((char*)strDirectory,sizeof(strDirectory) - 1,"%s",m_pStrArySubDirectory_Private->GetAt(dwLine - 1));
  202. m_pStrArySubDirectory_Private->RemoveAt(dwLine - 1);
  203. FindDirAndFile(strDirectory);
  204. if ( m_bCancel ) break;
  205. }
  206. return m_pStrAryResFile->GetSize();
  207. }
  208. /********************************************************************************
  209. * Function Type : private
  210. * Parameter : lpszDirectory - 要搜索的纯目录
  211. * Return Value : 获得的文件总数
  212. * Description : 所有一个目录下的所有目录和符合过滤条件的文件
  213. *********************************************************************************/
  214. DWORD CHwDir::FindDirAndFile(LPCTSTR lpszDirectory)
  215. {
  216. DWORD dwRet = 0;
  217. char strDirFile[MAX_PATH*2];
  218. hwSnprintf((char*)strDirFile,sizeof(strDirFile) - 1,"%s*.*",lpszDirectory); //先搜索出子目录
  219. dwRet += FindAllFileUnderOneDir((LPCTSTR)strDirFile,lpszDirectory,TRUE);
  220. hwSnprintf((char*)strDirFile,sizeof(strDirFile) - 1,"%s%s",lpszDirectory,m_strFilter); //再按过滤条件搜索
  221. dwRet += FindAllFileUnderOneDir(strDirFile,lpszDirectory,FALSE);
  222. return dwRet;
  223. }
  224. /********************************************************************************
  225. * Function Type : private
  226. * Parameter : lpszFileName - 要处理的文件(这里把目录也视为文件)
  227. * lpszDirectory - 纯目录(不需要再找目录了,减少计算量)
  228. * bFindDir - 是否只搜索目录,不理会文件
  229. * Return Value : 获得的文件总数
  230. * Description : 查找lpszFileName指定的所有文件或所有目录
  231. *********************************************************************************/
  232. DWORD CHwDir::FindAllFileUnderOneDir(LPCTSTR lpszFileName,LPCTSTR lpszDirectory,BOOL bFindDir)
  233. {
  234. DWORD dwFileNum = 0, dwDirNum = 0;
  235. WIN32_FIND_DATA FindData;
  236. HANDLE hFileHandle = FindFirstFile(lpszFileName,&FindData);
  237. if(hFileHandle == INVALID_HANDLE_VALUE)
  238. return dwFileNum;
  239. int iRet = HandleOneFile ( lpszDirectory, &FindData, bFindDir );
  240. if(iRet == 1) //是文件
  241. dwFileNum ++;
  242. else if(iRet == 2) //是目录
  243. dwDirNum ++;
  244. while ( FindNextFile ( hFileHandle, &FindData ) )
  245. {
  246. iRet = HandleOneFile ( lpszDirectory, &FindData, bFindDir );
  247. if(iRet == 1) //是文件
  248. dwFileNum ++;
  249. else if(iRet == 2) //是目录
  250. dwDirNum ++;
  251. if ( m_bCancel ) break;
  252. }
  253. FindClose(hFileHandle);
  254. return dwFileNum;
  255. }
  256. /********************************************************************************
  257. * Function Type : private
  258. * Parameter : lpszDirectory - 纯路径(不包含文件名)
  259. * pFindData - 文件信息
  260. * bFindDir - TRUE  : 只搜索目录,不理会文件
  261. * FALSE : 只搜索文件,不理会目录
  262. * Return Value : 1 - 是一个有效的文件
  263. * 2 - 是一个有效的目录
  264. * -1 _ - 不是想要的文件或目录
  265. * Description : 处理一个找到的文件(这里把目录也视为文件)
  266. *********************************************************************************/
  267. int CHwDir::HandleOneFile(LPCTSTR lpszDirectory, WIN32_FIND_DATA* pFindData,BOOL bFindDir)
  268. {
  269. char ResBuf[3*MAX_PATH];
  270. ULONGLONG FileSize;
  271. LPDWORD pDword = (LPDWORD)&FileSize;
  272. pDword[0] = pFindData->nFileSizeLow;
  273. pDword[1] = pFindData->nFileSizeHigh;
  274. ZeroMemory(ResBuf,sizeof(ResBuf));
  275. if(stricmp((const char*)pFindData->cFileName,"..")== 0 || pFindData->cFileName[0] == '.')
  276. return -1;
  277. if((pFindData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && 
  278. pFindData->dwFileAttributes != 0xffffffff)
  279. {
  280. if(bFindDir)
  281. {
  282. if(m_bSerachSubDir)
  283. {
  284. hwSnprintf((char*)ResBuf,sizeof(ResBuf) - 1,"%s%s\",lpszDirectory,pFindData->cFileName);
  285. m_pStrArySubDirectory_Private->Add((LPCTSTR)ResBuf);
  286. m_pStrArySubDirectory->Add((LPCTSTR)ResBuf);
  287. return 2;
  288. }
  289. }
  290. }
  291. else if(!bFindDir)
  292. {
  293. hwSnprintf((char*)ResBuf, sizeof(ResBuf) - 1,
  294. "%s%s", lpszDirectory+m_dwRelativePathStartPos, pFindData->cFileName );
  295. m_pStrAryResFile->Add((LPCTSTR)ResBuf);
  296. m_AmountBytes += FileSize;
  297. #ifdef _DEBUG
  298. printf("NO.%04d : %stt%dt字节n",m_pStrAryResFile->GetSize(),ResBuf,FileSize);
  299. #endif
  300. return 1;
  301. }
  302. return -1;
  303. }
  304. /********************************************************************************
  305. * Function Type : public
  306. * Parameter : None
  307. * Return Value : None
  308. * Description : 取字节总数
  309. *********************************************************************************/
  310. ULONGLONG CHwDir::GetAmountBytes()
  311. {
  312. return m_AmountBytes;
  313. }
  314. void CHwDir::Cancel()
  315. {
  316. m_bCancel = TRUE;
  317. }
  318. //////////////////////////////////////////////////////////////////////
  319. // CHwDirEx Class
  320. //////////////////////////////////////////////////////////////////////
  321. //////////////////////////////////////////////////////////////////////
  322. // Construction/Destruction
  323. //////////////////////////////////////////////////////////////////////
  324. CHwDirEx::CHwDirEx(
  325. LPCTSTR lpszMultiFindPath, // 要搜索的多路径,如“E:\winnt\;d:temp\;”
  326. LPCTSTR lpszMultiFindFilter, // 要搜索的过滤条件,如“*.bmp;*.exe;”
  327. LPCTSTR lpszMultiExcludeFilter/*=NULL*/, // 要排除的过滤条件,如“*.bmp;*.exe;”
  328. BOOL bSerachSubDir/* = TRUE*/, // 搜索子目录
  329. BOOL bAbsolutePath /*=TRUE*/, // 是绝对路径
  330. CHwDirEx **ppHwDirEx/*=NULL*/ // 将这个类的指针传出去给调用者
  331. )
  332. : m_AmountBytes ( 0 )
  333. , m_bCancel ( FALSE )
  334. , m_pHwDir ( NULL )
  335. {
  336. ASSERT ( lpszMultiFindPath && strlen(lpszMultiFindPath) > 0 );
  337. ASSERT ( lpszMultiFindFilter && strlen(lpszMultiFindFilter) > 0 );
  338. if ( ppHwDirEx ) *ppHwDirEx = this;
  339. m_pStrAryResFile = new CStringArray;
  340. if ( !m_pStrAryResFile ) return;
  341. m_pStrArySubDirectory = new CStringArray;
  342. if ( !m_pStrArySubDirectory ) return;
  343. CStringArray StrAryMultiFindPath;
  344. PartStringAndAddToStrAry ( (char*)lpszMultiFindPath, StrAryMultiFindPath, (char)f_seps[0] );
  345. for ( int i=0; i<StrAryMultiFindPath.GetSize(); i++ )
  346. {
  347. CString csFindPath = StrAryMultiFindPath.GetAt(i);
  348. DirAll ( csFindPath, lpszMultiFindFilter, lpszMultiExcludeFilter, bSerachSubDir, bAbsolutePath );
  349. if ( m_bCancel ) break;
  350. }
  351. }
  352. CHwDirEx::~CHwDirEx()
  353. {
  354. DeleteStrAry ( &m_pStrAryResFile );
  355. DeleteStrAry ( &m_pStrArySubDirectory );
  356. }
  357. ULONGLONG CHwDirEx::GetAmountBytes()
  358. {
  359. return m_AmountBytes;
  360. }
  361. void CHwDirEx::DirAll(
  362. LPCTSTR lpszFindPath, // 要搜索的路径,如“E:\winnt\”
  363. LPCTSTR lpszMultiFindFilter, // 要搜索的过滤条件,如“*.bmp;*.exe;”
  364. LPCTSTR lpszMultiExcludeFilter/*=NULL*/, // 要排除的过滤条件,如“*.bmp;*.exe;”
  365. BOOL bSerachSubDir/* = TRUE*/, // 搜索子目录
  366. BOOL bAbsolutePath /*=TRUE*/ // 是绝对路径
  367. )
  368. {
  369. ASSERT ( lpszFindPath && strlen(lpszFindPath) > 0 );
  370. CStringArray StrAryResFile_Find, StrAryResFile_Exclude,
  371. StrArySubDirectory_Find, StrArySubDirectory_Exclude;
  372. DWORD dwAmountBytes_Find = 0, dwAmountBytes_Exclude = 0;
  373. // 先搜索符合指定过滤条件的文件
  374. Dir ( lpszFindPath, lpszMultiFindFilter, StrAryResFile_Find, StrArySubDirectory_Find,
  375. dwAmountBytes_Find, bSerachSubDir, bAbsolutePath );
  376. // 再搜索需要排除的文件
  377. if ( lpszMultiExcludeFilter && strlen ( lpszMultiExcludeFilter ) > 0 )
  378. {
  379. ASSERT ( lpszMultiExcludeFilter && strlen(lpszMultiExcludeFilter) > 0 );
  380. Dir ( lpszFindPath, lpszMultiExcludeFilter, StrAryResFile_Exclude, StrArySubDirectory_Exclude,
  381. dwAmountBytes_Exclude, bSerachSubDir, bAbsolutePath );
  382. // 然后从 StrAryResFile_Find 中删除掉需要排除的文件
  383. for ( int i=0; i<StrAryResFile_Exclude.GetSize(); i++ )
  384. {
  385. CString csResFile = StrAryResFile_Exclude.GetAt(i);
  386. int nFindPos = FindFromArray ( StrAryResFile_Find, csResFile );
  387. if ( nFindPos >= 0 ) StrAryResFile_Find.RemoveAt ( nFindPos );
  388. if ( m_bCancel ) break;
  389. }
  390. }
  391. // 最后将搜索结果保存到成员变量中,并清理临时变量
  392. m_pStrAryResFile->Append ( StrAryResFile_Find );
  393. m_pStrArySubDirectory->Append ( StrArySubDirectory_Find );
  394. m_AmountBytes += (dwAmountBytes_Find - dwAmountBytes_Exclude);
  395. StrAryResFile_Find.RemoveAll();
  396. StrAryResFile_Exclude.RemoveAll();
  397. StrArySubDirectory_Find.RemoveAll();
  398. StrArySubDirectory_Exclude.RemoveAll();
  399. }
  400. void CHwDirEx::Dir(
  401. LPCTSTR lpszFindPath, // 要搜索的路径,如“E:\winnt\”
  402. LPCTSTR lpszMultiFindFilter, // 要搜索的过滤条件,如“*.bmp;*.exe;”
  403. CStringArray &StrAryResFile, // 搜索的文件保存到此
  404. CStringArray &StrArySubDirectory, // 搜索的子目录保存到此
  405. DWORD &dwAmountBytes, // 总字节数保存到此
  406. BOOL bSerachSubDir/* = TRUE*/, // 搜索子目录
  407. BOOL bAbsolutePath /*=TRUE*/ // 是绝对路径
  408. )
  409. {
  410. ASSERT ( lpszFindPath && strlen(lpszFindPath) > 0 );
  411. dwAmountBytes = 0;
  412. StrAryResFile.RemoveAll();
  413. StrArySubDirectory.RemoveAll();
  414. char szFindPath[MAX_PATH] = {0}, szMultiFindFilter[1024]={0}, szMultiExcludeFilter[1024]={0};
  415. STRNCPY_SZ ( szFindPath, lpszFindPath );
  416. STRNCPY_SZ ( szMultiFindFilter, lpszMultiFindFilter );
  417. StandardizationPathBuffer ( szFindPath, sizeof(szFindPath), '\' );
  418. char *token = strtok( szMultiFindFilter, f_seps );
  419. while( token != NULL )
  420. {
  421. /* While there are tokens in "string" */
  422. char szFindFile[MAX_PATH] = {0};
  423. hwSnprintf ( szFindFile, sizeof(szFindFile)-1, "%s%s", szFindPath, token );
  424. CHwDir dir ( szFindFile, bSerachSubDir, bAbsolutePath, &m_pHwDir );
  425. if ( dir.m_pStrAryResFile && dir.m_pStrArySubDirectory )
  426. {
  427. StrAryResFile.Append ( *(dir.m_pStrAryResFile) );
  428. StrArySubDirectory.Append ( *(dir.m_pStrArySubDirectory) );
  429. dwAmountBytes += (DWORD)dir.GetAmountBytes();
  430. }
  431. /* Get next token: */
  432. token = strtok( NULL, f_seps );
  433. if ( m_bCancel ) break;
  434. m_pHwDir = NULL;
  435. }
  436. }
  437. void CHwDirEx::Cancel()
  438. {
  439. m_bCancel = TRUE;
  440. if ( m_pHwDir )
  441. m_pHwDir->Cancel ();
  442. }
  443. CString GetOneLine(CString &str)
  444. {
  445. int nPos = str.Find ( "rn", 0 );
  446. if ( nPos < 0 ) return "";
  447. CString csOneLine = str.Left ( nPos );
  448. str = str.Mid ( nPos + 2 );
  449. return csOneLine;
  450. }
  451. int CalcCharCount ( LPCTSTR lpszText, char chCalc )
  452. {
  453. int nLen = STRLEN_SZ(lpszText);
  454. int nCount = 0;
  455. for ( int i=0; i<nLen; i++ )
  456. {
  457. if ( (BYTE)lpszText[i] == (BYTE)chCalc )
  458. nCount ++;
  459. }
  460. return nCount;
  461. }
  462. #define  TIME_START_YEAR  1900
  463. BOOL CopyBuffer_Date ( int *data, SYSTEMTIME &SysTime )
  464. {
  465. const int nMinDateDigitCount = 3;
  466. ASSERT_ADDRESS ( data, nMinDateDigitCount * sizeof(int) );
  467. /********年(1000 ~ 9999)********/
  468. if ( data[0] < 1000 || data[0] >= 9999 )
  469. return FALSE;
  470. SysTime.wYear = data[0];
  471. /********月(1--12)********/
  472. if ( data[1] < 1 || data[1] > 12 )
  473. return FALSE;
  474. SysTime.wMonth = data[1];
  475. /********日(1--31)********/
  476. if ( data[2] < 1 && data[2] > 31 )
  477. return FALSE;
  478. SysTime.wDay = data[2];
  479. return TRUE;
  480. }
  481. BOOL CopyBuffer_Time ( int *data, SYSTEMTIME &SysTime )
  482. {
  483. const int nMinDateDigitCount = 3;
  484. ASSERT_ADDRESS ( data, nMinDateDigitCount * sizeof(int) );
  485. /********时(0--23)********/
  486. if ( data[0] <0 || data[0] > 23 )
  487. return FALSE;
  488. SysTime.wHour = data[0];
  489. /********分(0--59)********/
  490. if ( data[1] < 0 || data[1] > 59 )
  491. return FALSE;
  492. SysTime.wMinute = data[1];
  493. /********秒********/
  494. if ( data[2] < 0 || data[2] > 59 )
  495. return FALSE;
  496. SysTime.wSecond = data[2];
  497. return TRUE;
  498. }
  499. //
  500. // ConvertStrToCTime() 将一个表示日期的字符串(按年、月、日、时、分、秒的顺序,
  501. // 如"2001-08-09 18:03:30")转成 CTime 格式.
  502. // return : ------------------------------------------------------------
  503. // 0 - 错误
  504. // 1 - 是时期时间
  505. // 2 - 是日期
  506. // 3 - 是时间
  507. //
  508. int ConvertStrToCTime(char *chtime, CTime &cTime )
  509. {
  510. int  i, j, k;
  511. char tmpbuf[8] = {0};
  512. int  value[6] = {0};
  513. SYSTEMTIME SysTime = {0};
  514. if ((!chtime) ) return FALSE; /* invalid parameter */
  515. memset((void *)value, 0, sizeof(value));
  516. for (i=0, j=0, k=0;  ; i++)
  517. {
  518. if (chtime[i]<'0' || chtime[i]>'9') /* 非数字字符 */
  519. {
  520. tmpbuf[j] = '';
  521. if ( j > 0 )
  522. {
  523. value[k++] = atoi(tmpbuf);
  524. j = 0;
  525. if ( k >= 6 ) break;
  526. }
  527. if ( chtime[i] == '' ) break;
  528. }
  529. else if (j < 7) tmpbuf[j++] = chtime[i];
  530. }
  531. if ( k < 3 ) return 0;
  532. if (
  533. CalcCharCount ( chtime, '-' ) < 2
  534. &&
  535. CalcCharCount ( chtime, '/' ) < 2
  536. &&
  537. CalcCharCount ( chtime, ':' ) < 2
  538. )
  539. return 0;
  540. int nRet = 0;
  541. // 是日期时间
  542. if (
  543. ( k>=6 )
  544. &&
  545. CopyBuffer_Date ( value, SysTime )
  546. &&
  547. CopyBuffer_Time ( &value[3], SysTime )
  548. )
  549. {
  550. nRet = 1;
  551. }
  552. // 是日期
  553. else if (
  554. (k>=3)
  555. &&
  556. CopyBuffer_Date ( value, SysTime )
  557. )
  558. {
  559. nRet = 2;
  560. }
  561. // 是时间
  562. if (
  563. (k>=3)
  564. &&
  565. CopyBuffer_Time ( value, SysTime )
  566. )
  567. {
  568. nRet = 3;
  569. }
  570. if ( SysTime.wYear < 1971 )
  571. SysTime.wYear = 1971;
  572. if ( SysTime.wMonth < 1 )
  573. SysTime.wMonth = 1;
  574. if ( SysTime.wDay < 1 )
  575. SysTime.wDay = 1;
  576. CTime tTemp ( SysTime );
  577. cTime = tTemp;
  578. return nRet;
  579. }
  580. void Log ( UINT nLevel, LPCTSTR lpszFormat, ... )
  581. {
  582. // 格式化
  583. char szLogBuf[1024] = {0};
  584. va_list  va;
  585. va_start (va, lpszFormat);
  586. _vsnprintf ( szLogBuf, sizeof(szLogBuf)-1, (const char*)lpszFormat, va);
  587. va_end(va);
  588. UINT nType = MB_ICONWARNING;
  589. nLevel &= 0x0f;
  590. if ( nLevel == L_VERBOSE || nLevel == L_NORMAL )
  591. nType = MB_ICONINFORMATION;
  592. else if ( nLevel == L_ERROR )
  593. nType = MB_ICONERROR;
  594. AfxMessageBox ( szLogBuf, nType );
  595. }
  596. /********************************************************************************
  597. * Function Type : public
  598. * Parameter : buf - 输出缓冲
  599. * Return Value : 字符个数
  600. * Description : 获取当前时间的字符串,如:2003-10-01 12:00:00
  601. *********************************************************************************/
  602. DWORD GetCurTimeString ( char *buf, time_t tNow/*=0*/ )
  603. {
  604. ASSERT_ADDRESS ( buf, DATETIME_TYPE_LENGTH );
  605. if ( tNow == 0 ) tNow = time(NULL);
  606. CTime cTime ( tNow );
  607. CString csNow = cTime.Format ( "%Y-%m-%d %H:%M:%S" );
  608. return (DWORD)hwSnprintf ( buf, DATETIME_TYPE_LENGTH, "%s", csNow );
  609. }
  610. CCriticalSection f_CSFor_DbgLog;
  611. void DbgLog ( LPCTSTR lpszFormat, ... )
  612. {
  613. // 格式化
  614. f_CSFor_DbgLog.Lock ();
  615. char szLogBuf[1024*4] = {0};
  616. char *p = szLogBuf;
  617. *p = '[';
  618. p ++;
  619. char szTime[32] = {0};
  620. int nLen = (int)GetCurTimeString ( szTime, sizeof(szTime) );
  621. strcpy ( p, szTime );
  622. p += nLen;
  623. *p = ']';
  624. p ++;
  625. *p = ' ';
  626. p ++;
  627. va_list  va;
  628. va_start (va, lpszFormat);
  629. _vsnprintf ( p, sizeof(szLogBuf)-1-(int)(p-szLogBuf), (const char*)lpszFormat, va);
  630. va_end(va);
  631. WriteDataToFile ( "c:\debug.txt", szLogBuf, strlen(szLogBuf), "ab+" );
  632. f_CSFor_DbgLog.Unlock ();
  633. }
  634. int GetMouthByShortStr ( LPCTSTR lpszShortMonth )
  635. {
  636. const char* szConstMonth[] =
  637. {
  638. "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", ""
  639. };
  640. CString csShortMonth = GET_SAFE_STRING ( lpszShortMonth );
  641. for ( int i=0; i<sizeof(szConstMonth)/sizeof(szConstMonth[0]); i++ )
  642. {
  643. if ( csShortMonth.CompareNoCase ( szConstMonth[i] ) == 0 )
  644. {
  645. return ( i+1 );
  646. }
  647. }
  648. return -1;
  649. };
  650. CString hwFormatMessage ( DWORD dwErrorCode )
  651. {
  652. CString csError;
  653. LPVOID pv;
  654.     FormatMessage (
  655. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  656. NULL,
  657. dwErrorCode,
  658. MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
  659. (LPTSTR)&pv,
  660. 0,
  661. NULL);
  662. if(pv)
  663. {
  664. csError = (char*)pv;
  665. LocalFree ( pv );
  666. }
  667. return csError;
  668. }
  669. /********************************************************************************
  670. * Function Type : Global
  671. * Parameter : filename - 文件名
  672. * data - 要保存的数据
  673. * mode - 文件打开的模式
  674. * size - 数据大小
  675. * nStartPos - 文件开始位置
  676. * Return Value : >=0 - 写入文件的大小
  677. * -1 - 写操作失败
  678. * Description : 保存数据到文件
  679. *********************************************************************************/
  680. int WriteDataToFile(LPCTSTR filename,char* data,long size,LPCTSTR mode, int nStartPos/*=-1*/ )
  681. {
  682. ASSERT ( filename && strlen(filename) > 0 );
  683. FILE *fp;
  684. long retval;
  685. fp=fopen((const char*)filename,(const char*)mode);
  686. if ( fp!=NULL)
  687. {
  688. if ( nStartPos >= 0 )
  689. {
  690. if ( fseek ( fp, nStartPos, SEEK_SET ) != 0 )
  691. return -1;
  692. }
  693. retval = (long)fwrite(data,sizeof(UCHAR),size,fp);
  694. fclose(fp);
  695. if(retval != size)
  696. {
  697. return -1;
  698. }
  699. else  return retval;
  700. }
  701. else
  702. {
  703. return -1;
  704. }
  705. }
  706. /********************************************************************************
  707. * Function Type : Global
  708. * Parameter : filename - 文件名
  709. * data - 读到的数据存于此缓冲
  710. * size - 缓冲大小
  711. * nStartPos - 文件开始位置
  712. * Return Value : >=0 - 读到数据的大小
  713. * -1 - 操作失败
  714. * Description : 从文件中读取数据
  715. *********************************************************************************/
  716. int ReadDataFromFile(LPCTSTR filename,char* data,long size, int nStartPos/*=-1*/)
  717. {
  718. FILE *fp;
  719. long retval;
  720. fp=fopen((const char*)filename,"rb");
  721. if ( fp!=NULL)
  722. {
  723. if ( nStartPos >= 0 )
  724. {
  725. if ( fseek ( fp, nStartPos, SEEK_SET ) != 0 )
  726. return -1;
  727. }
  728. retval = (long)fread(data,sizeof(char), size, fp);
  729. fclose(fp);
  730. if ( retval >= 0 ) return retval;
  731. }
  732. return -1;
  733. }
  734. CString Data2HexString ( int nOffset, char *data, int size )
  735. {
  736. CString csHexString, csTemp, csOffset;
  737. if ( nOffset >= 0 )
  738. {
  739. csOffset.Format ( "%08xh: ", nOffset );
  740. csHexString += csOffset;
  741. }
  742. for ( int i=0; i<size; i++ )
  743. {
  744. csTemp.Format ( "%02X ", (BYTE)data[i] );
  745. csHexString += csTemp;
  746. if ( (i+1) % 16 == 0 )
  747. {
  748. csHexString += "rn";
  749. if ( nOffset >= 0 )
  750. {
  751. nOffset += 16;
  752. csOffset.Format ( "%08xh: ", nOffset );
  753. csHexString += csOffset;
  754. }
  755. }
  756. }
  757. return csHexString;
  758. }
  759. //
  760. // 为了方便 strchr() 或 strrchr() 函数正确查找字符,将字符串中的中文字符串用指定的字符替换掉
  761. //
  762. void ReplaceChineseStrToEnglish ( char *szBuf, char cReplace )
  763. {
  764. if ( !szBuf ) return;
  765. for ( int i=0; szBuf[i] != ''; i++ )
  766. {
  767. if ( szBuf[i] < 0 && szBuf[i+1] != '' )
  768. {
  769. szBuf[i] = cReplace;
  770. szBuf[i+1] = cReplace;
  771. i ++;
  772. }
  773. }
  774. }
  775. /********************************************************************************
  776. * Function Type : Global
  777. * Parameter : lpszDirName - [in] 目录名
  778. * Return Value : 没有路径的文件名
  779. * Description : 确保路径存在,如果目录不存在就创建目录,可以创建多层次的目录
  780. *********************************************************************************/
  781. char* MakeSureDirectory(LPCTSTR lpszDirName)
  782. {
  783. char tempbuf[255];
  784. char *p1 = NULL, *p2 = (char*)lpszDirName;
  785. int len;
  786. while(1)
  787. {
  788. p1 = hwStrChr((const char*)p2,'\');
  789. if( p1 )
  790. {
  791. ZeroMemory(tempbuf,sizeof(tempbuf));
  792. len = (int)((p1 - lpszDirName > sizeof(tempbuf)) ? sizeof(tempbuf) : (p1 - lpszDirName));
  793. if(len < 1) //如:“123456”目录,第一个就是“”
  794. {
  795. p2 = p1 + 1;
  796. continue;
  797. }
  798. strncpy((char*)tempbuf,(const char*)lpszDirName, len);
  799. if(_access((const char*)tempbuf,0) == -1) //Not exist
  800. {
  801. if(_mkdir((const char*)tempbuf) != 0)
  802. return FALSE;
  803. }
  804. p2 = p1 + 1;
  805. }
  806. else break;
  807. }
  808. return p2;
  809. }
  810. int hwSnprintf ( char *buffer, int count, const char *format, ... )
  811. {
  812. if ( count < 1 ) return 0;
  813. ASSERT_ADDRESS ( buffer, count );
  814. memset ( buffer, 0, count );
  815. // 格式化
  816. va_list  va;
  817. va_start (va, format);
  818. int nRet = _vsnprintf ( buffer, count, (const char*)format, va);
  819. va_end(va);
  820. buffer [count-1] = '';
  821. int nLen = nRet;
  822. if ( nLen < 0 ) nLen = strlen(buffer);
  823. if ( nLen > count ) nLen = count;
  824. return nLen;
  825. }
  826. //
  827. //
  828. // 从一个完整的全路径名(包含文件名)中分离出路径(没有文件名)和
  829. // 文件名,如:从“E:0102.exe”中分得“E:01”,结果存入到
  830. // lsOnlyPath中,“002.exe”存入szOnlyFileName中
  831. //
  832. BOOL PartFileAndPathByFullPath (
  833. IN LPCTSTR lpszFilePath, // 全路径名(包含文件名)
  834. OUT char *szOnlyFileName, // 光文件名(没有路径)
  835. int nFileNameSize,
  836. OUT char *szOnlyPath /*=NULL*/, // 光路径(没有文件名)
  837. int nPathSize/*=0*/
  838. )
  839. {
  840. ASSERT ( lpszFilePath );
  841. char chDirPart = '\';
  842. if ( hwStrChr ( lpszFilePath, '/' ) )
  843. chDirPart = '/';
  844. if ( szOnlyFileName )
  845. {
  846. memset ( szOnlyFileName, 0, nFileNameSize );
  847. }
  848. if ( szOnlyPath )
  849. {
  850. memset ( szOnlyPath, 0, nPathSize );
  851. }
  852. WIN32_FILE_ATTRIBUTE_DATA FileAttrData;
  853. if ( GetFileAttributesEx ( lpszFilePath, GetFileExInfoStandard, (LPVOID)&FileAttrData ) &&
  854. ( FileAttrData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY
  855. && FileAttrData.dwFileAttributes != 0xffffffff ) // 本身就是目录
  856. {
  857. if ( szOnlyPath )
  858. {
  859. STRNCPY ( szOnlyPath, lpszFilePath, nPathSize );
  860. StandardizationPathBuffer ( szOnlyPath, nPathSize, chDirPart );
  861. }
  862. return TRUE;
  863. }
  864. char *p = hwStrrChr ( lpszFilePath, chDirPart );
  865. if ( !p )
  866. {
  867. STRNCPY ( szOnlyFileName, lpszFilePath, nFileNameSize );
  868. return TRUE;
  869. }
  870. if ( szOnlyFileName )
  871. STRNCPY ( szOnlyFileName, p+1, nFileNameSize );
  872. if ( szOnlyPath )
  873. {
  874. STRNCPY ( szOnlyPath, lpszFilePath, nPathSize );
  875. int nLen = p-lpszFilePath+1;
  876. if ( nPathSize-1 < nLen ) return FALSE;
  877. szOnlyPath [ nLen ] = '';
  878. }
  879. return TRUE;
  880. }
  881. BOOL PartPathAndFileAndExtensionName (
  882. IN LPCTSTR lpszFilePath, // 全路径名(包含文件名)
  883. OUT CString *pcsOnlyPath, // 输出光路径(没有文件名)
  884. OUT CString *pcsOnlyFileName, // 输出光文件名(没有路径)
  885. OUT CString *pcsExtensionName // 输出扩展名
  886. )
  887. {
  888. char szOnlyPath[MAX_PATH] = {0};
  889. char szOnlyFileName[MAX_PATH] = {0};
  890. char szExtensionName[MAX_PATH] = {0};
  891. if ( !PartFileAndPathByFullPath ( lpszFilePath, szOnlyFileName, MAX_PATH, szOnlyPath, MAX_PATH ) )
  892. return FALSE;
  893. if ( !PartFileAndExtensionName ( szOnlyFileName, szOnlyFileName, MAX_PATH, szExtensionName, MAX_PATH ) )
  894. return FALSE;
  895. if ( pcsOnlyPath ) *pcsOnlyPath = szOnlyPath;
  896. if ( pcsOnlyFileName ) *pcsOnlyFileName = szOnlyFileName;
  897. if ( pcsExtensionName ) *pcsExtensionName = szExtensionName;
  898. return TRUE;
  899. }
  900. char *hwStrrChr ( const char *string, int c )
  901. {
  902. if ( !string ) return NULL;
  903. CString csString = string;
  904. ReplaceChineseStrToEnglish ( csString.GetBuffer(0), (c>=127) ? (c-1) : (c+1) );
  905. csString.ReleaseBuffer ();
  906. int nPos = csString.ReverseFind ( c );
  907. if ( nPos < 0 ) return NULL;
  908. return ( (char*)string + nPos );
  909. }
  910. char *hwStrChr ( const char *string, int c )
  911. {
  912. if ( !string ) return NULL;
  913. CString csString = string;
  914. ReplaceChineseStrToEnglish ( csString.GetBuffer(0), (c>=127) ? (c-1) : (c+1) );
  915. csString.ReleaseBuffer ();
  916. int nPos = csString.Find ( c );
  917. if ( nPos < 0 ) return NULL;
  918. return ( (char*)string + nPos );
  919. }
  920. //
  921. // 根据文件名来找它的文件名和扩展名,如:完整路径为“E:123456.bmp”,那么 szFileName 等于“E:123456”
  922. // szExtensionName 等于“bmp”
  923. //
  924. BOOL PartFileAndExtensionName (
  925. IN LPCTSTR lpszFileName,
  926. OUT char *szFileName,
  927. IN int nFileNameSize,
  928. OUT char *szExtensionName/*=NULL*/,
  929. IN int nExtensionNameSize/*=0*/ )
  930. {
  931. ASSERT ( lpszFileName );
  932. char chDirPart = '\';
  933. if ( hwStrChr ( lpszFileName, '/' ) )
  934. chDirPart = '/';
  935. if ( szFileName )
  936. {
  937. STRNCPY ( szFileName, lpszFileName, nFileNameSize );
  938. }
  939. if ( szExtensionName )
  940. {
  941. memset ( szExtensionName, 0, nExtensionNameSize );
  942. }
  943. char *p_Dot = hwStrrChr ( lpszFileName, '.' );
  944. if ( !p_Dot )
  945. {
  946. return TRUE;
  947. }
  948. char *p_Slash = hwStrrChr ( lpszFileName, chDirPart );
  949. if ( szFileName )
  950. {
  951. if ( p_Dot-lpszFileName >= nFileNameSize )
  952. return FALSE;
  953. // TRACE ( "%d, %dn", p_Dot-lpszFileName, strlen(lpszFileName) );
  954. if ( int(p_Dot-lpszFileName) < (int)strlen(lpszFileName)-1 )
  955. szFileName [p_Dot-lpszFileName] = '';
  956. }
  957. if ( p_Slash > p_Dot )
  958. {
  959. return TRUE;
  960. }
  961. if ( szExtensionName )
  962. {
  963. STRNCPY ( szExtensionName, p_Dot+1, nExtensionNameSize );
  964. }
  965. return TRUE;
  966. }
  967. //
  968. // 删除一个文件夹,不管里面有没有文件,都会被删除
  969. //
  970. BOOL hwDeleteFolder ( LPCTSTR lpszFolder )
  971. {
  972. BOOL bRet = FALSE;
  973. CHwDir dir ( lpszFolder, TRUE, TRUE );
  974. if ( !dir.m_pStrAryResFile || !dir.m_pStrArySubDirectory )
  975. return FALSE;
  976. for ( int i=0; i<dir.m_pStrAryResFile->GetSize(); i++ )
  977. {
  978. CString csFileName = dir.m_pStrAryResFile->GetAt ( i );
  979. bRet = ::SetFileAttributes ( csFileName, FILE_ATTRIBUTE_NORMAL );
  980. bRet = ::DeleteFile ( csFileName );
  981. if ( !bRet )
  982. {
  983. DWORD dwLastError = ::GetLastError ();
  984. }
  985. }
  986. for ( i=dir.m_pStrArySubDirectory->GetSize()-1; i>=0; i-- )
  987. {
  988. CString csDirName = dir.m_pStrArySubDirectory->GetAt ( i );
  989. TRACE ( "Delete dir : %sn", csDirName );
  990. bRet = ::SetFileAttributes ( csDirName, FILE_ATTRIBUTE_NORMAL );
  991. bRet = RemoveDirectory ( csDirName );
  992. }
  993. return RemoveDirectory ( lpszFolder );
  994. }
  995. //
  996. // 将一个文件追加拷贝到另一个文件末尾
  997. //
  998. BOOL CopyFileAppend ( LPCTSTR lpszFileName_Src, LPCTSTR lpszFileName_Dst, int nOffset )
  999. {
  1000. if ( !lpszFileName_Src || !lpszFileName_Dst ) return FALSE;
  1001. CFileStatus fileStatus;
  1002. if ( !CFile::GetStatus(lpszFileName_Src,fileStatus) || fileStatus.m_size < 1 )
  1003. {
  1004. return TRUE;
  1005. }
  1006. const int nBufSize = 1024*1024;
  1007. char *pTempBuf = new char[nBufSize];
  1008. if ( !pTempBuf ) return FALSE;
  1009. BOOL bRet = FALSE;
  1010. CFile file_Src, file_Dst;
  1011. TRY
  1012. {
  1013. if ( file_Src.Open ( lpszFileName_Src, CFile::modeRead|CFile::typeBinary ) &&
  1014. file_Dst.Open ( lpszFileName_Dst, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::typeBinary ) )
  1015. {
  1016. if ( nOffset >= 0 )
  1017. {
  1018. file_Dst.Seek ( nOffset, CFile::begin );
  1019. }
  1020. else
  1021. {
  1022. file_Dst.SeekToEnd ();
  1023. }
  1024. int nReadSize = 0;
  1025. while ( (nReadSize = file_Src.ReadHuge ( pTempBuf, nBufSize )) > 0 )
  1026. {
  1027. file_Dst.WriteHuge ( pTempBuf, nReadSize );
  1028. }
  1029. bRet = TRUE;
  1030. }
  1031. }
  1032. CATCH( CFileException, e )
  1033. {
  1034. e->Delete ();
  1035. bRet = FALSE;
  1036. }
  1037. END_CATCH
  1038. if ( pTempBuf ) delete[] pTempBuf;
  1039. if ( HANDLE_IS_VALID(file_Src.m_hFile) )
  1040. file_Src.Close ();
  1041. if ( HANDLE_IS_VALID(file_Dst.m_hFile) )
  1042. file_Dst.Close ();
  1043. return bRet;
  1044. }
  1045. //
  1046. // 创建一个空文件
  1047. //
  1048. BOOL CreateNullFile ( LPCTSTR lpszFileName, int nFileSize )
  1049. {
  1050. if ( !lpszFileName ) return FALSE;
  1051. DeleteFile ( lpszFileName );
  1052. CFile file;
  1053. BOOL bRet = TRUE;
  1054. TRY
  1055. {
  1056. bRet = file.Open ( lpszFileName, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary );
  1057. if ( bRet && nFileSize > 0 )
  1058. file.SetLength ( nFileSize );
  1059. }
  1060. CATCH( CFileException, e )
  1061. {
  1062. e->Delete ();
  1063. bRet = FALSE;
  1064. }
  1065. END_CATCH
  1066. if ( !bRet )
  1067. {
  1068. Log ( L_WARNING, "Create file [%s] failed. %s", lpszFileName, hwFormatMessage ( GetLastError() ) );
  1069. }
  1070. if ( HANDLE_IS_VALID(file.m_hFile) )
  1071. file.Close ();
  1072. return bRet;
  1073. }
  1074. //
  1075. // 等待线程退出
  1076. //
  1077. BOOL WaitForThreadEnd ( HANDLE hThread, DWORD dwWaitTime /*=5000*/ )
  1078. {
  1079. BOOL bRet = TRUE;
  1080. if ( !HANDLE_IS_VALID(hThread) ) return TRUE;
  1081. if ( ::WaitForSingleObject ( hThread, dwWaitTime ) == WAIT_TIMEOUT )
  1082. {
  1083. bRet = FALSE;
  1084. ::TerminateThread ( hThread, 0 );
  1085. }
  1086. return bRet;
  1087. }
  1088. /********************************************************************************
  1089. * Function Type : Global
  1090. * Parameter : lpszPathName - [out] 选择的路径名
  1091. * Return Value : 路径字符数
  1092. * Description : 从通用对话框中选择路径
  1093. * Note : 缓冲lpszPathName申请时建议大小为“MAX_PATH”
  1094. *********************************************************************************/
  1095. DWORD SelectPathByCommonDlg(LPSTR lpszPathName,HWND hwndOwner/*=NULL*/)
  1096. {
  1097. ASSERT_ADDRESS ( lpszPathName, MAX_PATH );
  1098. DWORD dwLength = 0;
  1099. LPMALLOC pMalloc; //利用shell的扩展功能
  1100. BROWSEINFO bi;
  1101. if ( !SUCCEEDED(SHGetMalloc(&pMalloc)) ) //为生成目录选择对话框分配内存
  1102. return 0;
  1103. ZeroMemory( (char*)&bi, sizeof(bi) );
  1104. LPITEMIDLIST pidl;
  1105. bi.hwndOwner = hwndOwner;
  1106. bi.pidlRoot = NULL;
  1107. bi.pszDisplayName = (LPSTR)lpszPathName;
  1108. bi.lpszTitle = _T("Select Directory");
  1109. bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
  1110. bi.lpfn = NULL;
  1111. bi.lParam = 0;
  1112. if ( (pidl = ::SHBrowseForFolder(&bi)) != NULL)//调用选择目录对话框
  1113. {
  1114. // 获得所选择的目录
  1115. if ( ::SHGetPathFromIDList(pidl, (LPSTR)lpszPathName) )
  1116. {
  1117. dwLength = (DWORD)strlen((const char*)lpszPathName);
  1118. if(lpszPathName[dwLength-1] != '\')
  1119. {
  1120. strcat((char*)lpszPathName,"\");
  1121. dwLength ++;
  1122. }
  1123. }
  1124. pMalloc->Free(pidl);//释放分配的资源
  1125. }
  1126. pMalloc->Release();
  1127. return dwLength;
  1128. }
  1129. BOOL SelectPathByCommonDlg ( CWnd *pDlg, UINT nEditID )
  1130. {
  1131. if ( !pDlg || nEditID < 1 ) return FALSE;
  1132. char szPath[MAX_PATH] = {0};
  1133. if ( SelectPathByCommonDlg ( szPath, pDlg->GetSafeHwnd() ) > 0 )
  1134. {
  1135. pDlg->SetDlgItemText ( nEditID, szPath );
  1136. return TRUE;
  1137. }
  1138. return FALSE;
  1139. }
  1140. //
  1141. // 标准化路径缓冲,如果不是以“”结尾,将自动加上
  1142. //
  1143. void StandardizationPathBuffer ( char *szPath, int nSize, char cFlagChar/*='\'*/ )
  1144. {
  1145. int nLen = strlen(szPath);
  1146. if ( nLen < 1 ) return;
  1147. ASSERT_ADDRESS ( szPath, nLen+1 );
  1148. char szTemp[4] = {0};
  1149. szTemp[0] = cFlagChar;
  1150. if ( szPath[nLen-1] != cFlagChar )
  1151. strncat ( szPath, szTemp, nSize );
  1152. CString csPath = StandardizationFileForPathName ( szPath, FALSE );
  1153. strncpy ( szPath, csPath, nSize );
  1154. }
  1155. //
  1156. // 标准化路径或文件名,把不符合文件名命名规则的字符替换成指定的字符。//u 在 StandardizationPathBuffer() 中
  1157. // 加上该函数
  1158. //
  1159. CString StandardizationFileForPathName ( LPCTSTR lpszFileOrPathName, BOOL bIsFileName, char cReplaceChar/*='_'*/ )
  1160. {
  1161. CString csFileOrPathName = GET_SAFE_STRING(lpszFileOrPathName);
  1162. CString csHead, csTail;
  1163. // 路径名中最后一个'\'是正常的。另外类似“c:\”的字符也是正常的。所以先提取出来不参与后面的替换,等替换完以后再补回来
  1164. if ( !bIsFileName )
  1165. {
  1166. if ( csFileOrPathName.GetLength() >= 1 && (csFileOrPathName[csFileOrPathName.GetLength()-1] == '\' || csFileOrPathName[csFileOrPathName.GetLength()-1] == '/') )
  1167. {
  1168. csTail += csFileOrPathName[csFileOrPathName.GetLength()-1];
  1169. csFileOrPathName = csFileOrPathName.Left ( csFileOrPathName.GetLength()-1 );
  1170. }
  1171. if ( csFileOrPathName.GetLength() >= 2 && isalpha(csFileOrPathName[0]) && csFileOrPathName[1]==':' )
  1172. {
  1173. csHead = csFileOrPathName.Left(2);
  1174. csFileOrPathName = csFileOrPathName.Mid(2);
  1175. }
  1176. if ( csFileOrPathName.GetLength() >= 1 && (csFileOrPathName[0]=='\' || csFileOrPathName[0]=='/') )
  1177. {
  1178. csHead += csFileOrPathName[0];
  1179. csFileOrPathName = csFileOrPathName.Mid(1);
  1180. }
  1181. }
  1182. csFileOrPathName.Replace ( "\", "_" );
  1183. csFileOrPathName.Replace ( "/", "_" );
  1184. csFileOrPathName.Replace ( ":", "_" );
  1185. csFileOrPathName.Replace ( "*", "_" );
  1186. csFileOrPathName.Replace ( "?", "_" );
  1187. csFileOrPathName.Replace ( """, "_" );
  1188. csFileOrPathName.Replace ( "<", "_" );
  1189. csFileOrPathName.Replace ( ">", "_" );
  1190. csFileOrPathName.Replace ( "|", "_" );
  1191. csFileOrPathName.Insert ( 0, csHead );
  1192. csFileOrPathName += csTail;
  1193. return csFileOrPathName;
  1194. }