FileBase.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:13k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // FileBase.cpp: implementation of the FileBase class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "FileBase.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. bool CopyTextToClipboard(CString strSource)
  16. {
  17. bool bRet = true;
  18. // put strSource to clipboard.
  19. if(OpenClipboard(NULL))
  20. {
  21. EmptyClipboard();
  22. HGLOBAL clipbuffer = GlobalAlloc(GMEM_DDESHARE, strSource.GetLength()+1);
  23. if (clipbuffer) 
  24. {
  25. char * buffer = (char*)GlobalLock(clipbuffer);
  26. if (buffer)
  27. {
  28. strcpy(buffer, LPCSTR(strSource));
  29. GlobalUnlock(clipbuffer);
  30. SetClipboardData(CF_TEXT,clipbuffer);
  31. }
  32. else
  33. bRet = false;
  34. }
  35. else
  36. bRet = false;
  37. CloseClipboard();
  38. }
  39. else
  40. bRet = false;
  41. return true;
  42. }
  43. string FormatSizeK(BLONG lSize, bool bFloat)
  44. {
  45. assert(lSize >= 0);
  46. char szText[100] = {0};
  47. float lposition = (float)lSize/1024;
  48. if (bFloat)
  49. sprintf(szText, "%.2fK", lposition);
  50. else
  51. sprintf(szText, "%.0fK", lposition);
  52. return string(szText);
  53. }
  54. string FormatSizeM(BLONG lSize, bool bFloat)
  55. {
  56. assert(lSize >= 0);
  57. char szText[100] = {0};
  58. float lposition = (float)lSize/1024/1024;
  59. if (bFloat)
  60. sprintf(szText, "%.2fM", lposition);
  61. else
  62. sprintf(szText, "%.0fM", lposition);
  63. return string(szText);
  64. }
  65. string FormatSize(BLONG lSize, bool bFloat)
  66. {
  67. assert(lSize >= 0);
  68. char szText[100] = {0};
  69. float lposition = (float)lSize/1024/1024/1024;
  70. if (lposition >= 1)
  71. {
  72. if (bFloat)
  73. sprintf(szText, "%.2fG", lposition);
  74. else
  75. sprintf(szText, "%.0fG", lposition);
  76. return string(szText);
  77. }
  78. lposition = (float)lSize/1024/1024;
  79. if (lposition >= 1)
  80. {
  81. if (bFloat)
  82. sprintf(szText, "%.2fM", lposition);
  83. else
  84. sprintf(szText, "%.0fM", lposition);
  85. return string(szText);
  86. }
  87. lposition = (float)lSize/1024;
  88. if (lposition >= 1)
  89. {
  90. if (bFloat)
  91. sprintf(szText, "%.2fK", lposition);
  92. else
  93. sprintf(szText, "%.0fK", lposition);
  94. return string(szText);
  95. }
  96. sprintf(szText, "%dB", lSize);
  97. return string(szText);
  98. }
  99. long GetFileSize(string strFileName)
  100. {
  101. FILE* pfile = fopen(strFileName.data(), "rb");
  102. if (!pfile)
  103. {
  104. // assert(false);
  105. return 0;
  106. }
  107. int iRet = fseek(pfile, 0, SEEK_END);
  108. if (iRet)
  109. {
  110. assert(false);
  111. return 0;
  112. }
  113. long lsize = ftell(pfile);
  114. fclose(pfile);
  115. assert(lsize >= 0);
  116. return lsize;
  117. }
  118. bool MakesureFileCreate(string strFilePath)
  119. {
  120. char drive[_MAX_DRIVE];
  121. char dir[_MAX_DIR];
  122. char fname[_MAX_FNAME];
  123. char ext[_MAX_EXT];
  124. _splitpath(strFilePath.data(), drive, dir, fname, ext);
  125. if (!strlen(drive))
  126. return false;
  127. string strDir = drive;
  128. strDir += dir;
  129. if (strDir[strDir.size() - 1] != '\')
  130. strDir += '\';
  131. if (!MakeDirecotry(strDir))
  132. return false;
  133. return true;
  134. }
  135. bool MakeDirecotry(string strDir)
  136. {
  137. if (strDir.empty())
  138. return false;
  139. // make sure directory is absolute path.
  140. char drive[_MAX_DRIVE];
  141. char dir[_MAX_DIR];
  142. char fname[_MAX_FNAME];
  143. char ext[_MAX_EXT];
  144. _splitpath(strDir.data(), drive, dir, fname, ext);
  145. if (!strlen(drive))
  146. return false;
  147. CString strPath = strDir.data();
  148. int i = 0;
  149. while (true)
  150. {
  151. i = strPath.Find('\', i+1);
  152. if (i == -1) 
  153. break;
  154. string strTemp = strPath.Left(i);
  155. if (!CreateDirectory(strTemp.data(), 0))
  156. {
  157. /*
  158. DWORD dwErr = GetLastError();
  159. if (dwErr != ERROR_ALREADY_EXISTS)
  160. return false;
  161. //*/
  162. }
  163. }
  164. if (!CreateDirectory(strDir.data(), 0))
  165. {
  166. DWORD dwErr = GetLastError();
  167. if (dwErr != ERROR_ALREADY_EXISTS && dwErr != ERROR_ACCESS_DENIED)
  168. return false;
  169. }
  170. return true;
  171. }
  172. string formatDir(string strDir)
  173. {
  174. assert(!strDir.empty());
  175. string strRet;
  176. if (strDir[strDir.size() - 1] != '\')
  177. strDir += '\';
  178. return strDir;
  179. }
  180. static m_gMovingFiles = 0;
  181. int IsMovingFiles()
  182. {
  183. return m_gMovingFiles;
  184. }
  185. bool MoveDiretorySystem(vector<CString> vstrOld, CString strNew, HWND hWnd)
  186. {
  187. if (vstrOld.empty())
  188. {
  189. assert(false);
  190. return false;
  191. }
  192. DWORD dwAttr = GetFileAttributes(strNew);
  193. if (dwAttr ==  0xffffffff)
  194. {
  195. if (!MakeDirecotry(strNew.GetBuffer(0)))
  196. {
  197. assert(false);
  198. return false;
  199. }
  200. }
  201. //
  202. // Create the target dir, else move not create name dir.
  203. //
  204. char pstrOld[1024] = {0};
  205. char pstrNew[1024] = {0};
  206. memset(pstrOld, 0, 1024);
  207. memset(pstrNew, 0, 1024);
  208. char* pTempOld = pstrOld;
  209. char* pTempNew = pstrNew;
  210. bool bEmpty = true;
  211. for (int i=0; i<vstrOld.size(); i++)
  212. {
  213. CString strOld = vstrOld[i];
  214. string strName, strPath;
  215. SplitPathName(strOld.GetBuffer(0), strPath, strName);
  216. if (formatDir(strPath) == formatDir(strNew.GetBuffer(0)) )
  217. {
  218. // assert(false);
  219. // return true;
  220. continue;
  221. }
  222. strcpy(pTempOld, strOld.GetBuffer(0));
  223. strcpy(pTempNew, strNew.GetBuffer(0));
  224. pTempOld += strlen(pTempOld) + 1;
  225. pTempNew += strlen(pTempNew) + 1;
  226. bEmpty = false;
  227. }
  228. if (bEmpty) 
  229. {
  230. assert(false);
  231. return true;
  232. }
  233. SHFILEOPSTRUCT shFileOp;
  234. shFileOp.fAnyOperationsAborted = FALSE;
  235. shFileOp.lpszProgressTitle = "正在移动...";
  236. shFileOp.hwnd = hWnd;
  237. shFileOp.wFunc = FO_MOVE;
  238. shFileOp.pFrom = pstrOld;
  239. shFileOp.pTo = pstrNew;
  240. shFileOp.fFlags = FOF_ALLOWUNDO;// | FOF_RENAMEONCOLLISION | FOF_WANTMAPPINGHANDLE | ;
  241. shFileOp.hNameMappings = 0;
  242. m_gMovingFiles ++;
  243. int iRet = SHFileOperation(&shFileOp);
  244. m_gMovingFiles --;
  245. // WaitForSingleObject((HANDLE)iRet, 50000);
  246. //*/
  247. /*
  248. if(iRet)
  249. {
  250. shFileOp.pFrom = b;
  251. shFileOp.pTo = a;
  252. int iRet = SHFileOperation(&shFileOp);
  253. ASSERT(!iRet);
  254. }
  255. //*/
  256. // return shFileOp.fAnyOperationsAborted == false;
  257. return iRet == 0;
  258. }
  259. bool MoveDiretory(string strOld, string strNew)
  260. {
  261. strOld = formatDir(strOld);
  262. strNew = formatDir(strNew);
  263. if (_access(strOld.data(), 0))
  264. return true;
  265. if (strOld == strNew)
  266. return true;
  267. if (MoveFile(strOld.data(), strNew.data()))
  268. {
  269. assert(false);
  270. return true;
  271. }
  272. if (!MakeDirecotry(strNew))
  273. return false;
  274. WIN32_FIND_DATA FileData;   // Data structure describes the file found
  275. HANDLE hSearch;             // Search handle returned by FindFirstFile
  276. TCHAR szMsg[100];           // String to store the error message
  277. BOOL bFinished = FALSE;
  278. hSearch = FindFirstFile ((strOld + "*.*").data(), &FileData);
  279. if (hSearch == INVALID_HANDLE_VALUE)
  280. {
  281. wsprintf (szMsg, TEXT("No .TXT files found."));
  282. return true;
  283. }
  284. // Copy each .txt file to the new directory and change it to
  285. // read-only, if it is not already read-only.
  286. while (!bFinished)
  287. {
  288. string strNewPath = strNew + FileData.cFileName;
  289. string strOldPath = strOld + FileData.cFileName;
  290. if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
  291. {
  292. if (!CopyFile (strOldPath.data(), strNewPath.data(), FALSE))
  293. {
  294. DWORD dwErr = GetLastError();
  295. // maybe the parent dir have subdir has the same name with the file, fail silently.
  296. if (dwErr != ERROR_ACCESS_DENIED)
  297. {
  298. wsprintf (szMsg, TEXT("Unable to copy file."));
  299. return false;
  300. }
  301. }
  302. }
  303. if (!FindNextFile (hSearch, &FileData))
  304. {
  305. bFinished = TRUE;
  306. if (GetLastError () == ERROR_NO_MORE_FILES)
  307. {
  308. wsprintf (szMsg, TEXT("Found all of the files."));
  309. return true;
  310. }
  311. else
  312. {
  313. wsprintf (szMsg, TEXT("Unable to find next file."));
  314. return false;
  315. }
  316. }
  317. }
  318. // Close the search handle.
  319. if (!FindClose (hSearch))
  320. {
  321. wsprintf (szMsg, TEXT("Unable to close search handle."));
  322. return false;
  323. }
  324. // Remove old files.
  325. return true;
  326. }
  327. bool DeleteDiretory(CString strOld)
  328. {
  329. //
  330. // dosn't exist.
  331. //
  332. DWORD dwAttr = GetFileAttributes(strOld);
  333. if (dwAttr ==  0xffffffff)
  334. return true;
  335. //
  336. // if file.
  337. //
  338. if (dwAttr != 0xffffffff && !(dwAttr & FILE_ATTRIBUTE_DIRECTORY))
  339. {
  340. if (!DeleteFile (strOld))
  341. {
  342. if (GetLastError() == ERROR_ACCESS_DENIED)
  343. {
  344. if (!SetFileAttributes(strOld, FILE_ATTRIBUTE_NORMAL))
  345. return false;
  346. if (!DeleteFile (strOld))
  347. return false;
  348. }
  349. }
  350. return true;
  351. }
  352. //
  353. // if directory.
  354. //
  355. strOld = formatDir(strOld.GetBuffer(0)).data();
  356. WIN32_FIND_DATA FileData;   // Data structure describes the file found
  357. BOOL bFinished = FALSE;
  358. HANDLE hSearch = FindFirstFile (strOld + "*.*", &FileData);
  359. if (hSearch == INVALID_HANDLE_VALUE)
  360. return false;
  361. while (!bFinished)
  362. {
  363. CString strOldPath = strOld + FileData.cFileName;
  364. if (string(FileData.cFileName) != "." &&
  365. string(FileData.cFileName) != ".." )
  366. {
  367. if (!DeleteDiretory(strOldPath))
  368. {
  369. FindClose (hSearch);
  370. return false;
  371. }
  372. }
  373. if (!FindNextFile (hSearch, &FileData))
  374. bFinished = TRUE;
  375. }
  376. // Close the search handle.
  377. if (!FindClose (hSearch))
  378. return false;
  379. if (!RemoveDirectory(strOld))
  380. return false;
  381. return true;
  382. }
  383. bool SplitPathName(string strFilePath, string& strPath, string& strName)
  384. {
  385. // get name map.
  386. if (strFilePath[strFilePath.size() - 1] == '\')
  387. strFilePath.erase(strFilePath.size() - 1);
  388. // copy file to db directory.
  389. char drive[_MAX_DRIVE];
  390. char dir[_MAX_DIR];
  391. char fname[_MAX_FNAME];
  392. char ext[_MAX_EXT];
  393. _splitpath(strFilePath.data(), drive, dir, fname, ext);
  394. if (!strlen(drive) || !strlen(fname))
  395. return false;
  396. strPath = drive;
  397. strPath += dir;
  398. strName = fname;
  399. strName += ext;
  400. return true;
  401. }
  402. ///////////////////////////////////////////////////////////////////////////
  403. // return val : if return string is empty, it is the user cancel select.
  404. /*
  405. string SelectFolder()
  406. {
  407. string strRet;
  408. LPMALLOC pMalloc;
  409.     if (::SHGetMalloc(&pMalloc) == NOERROR)
  410.     {
  411.         BROWSEINFO bi;
  412.         char pszBuffer[MAX_PATH];
  413.         LPITEMIDLIST pidl;
  414.         // Get help on BROWSEINFO struct - it's got all the bit settings.
  415.         bi.hwndOwner = AfxGetMainWnd()->GetSafeHwnd();
  416.         bi.pidlRoot = NULL;
  417.         bi.pszDisplayName = pszBuffer;
  418.         bi.lpszTitle = _T("Select a Starting Directory");
  419.         bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; //|BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT; //|BIF_VALIDATE|BIF_EDITBOX;
  420.         bi.lpfn = NULL;
  421.         bi.lParam = 0;
  422.         // This next call issues the dialog box.
  423.         if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)
  424.         {
  425.             if (::SHGetPathFromIDList(pidl, pszBuffer))
  426.             { 
  427. strRet = pszBuffer;
  428.             }
  429.             pMalloc->Free(pidl);
  430.         }
  431.         // Release the shell's allocator.
  432.         pMalloc->Release();
  433.     }
  434. return strRet;
  435. }
  436. //*/
  437. #define BIF_USENEWUI 0x40
  438. int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData);
  439. bool SelectFolder(const CString strDefault, CString &strRet)
  440. {
  441. strRet.Empty();
  442. BROWSEINFO bi;
  443. TCHAR szDir[MAX_PATH];
  444. LPITEMIDLIST pidl;
  445. LPMALLOC pMalloc;
  446. if (SUCCEEDED(SHGetMalloc(&pMalloc))) 
  447. {
  448. ZeroMemory(&bi,sizeof(bi));
  449. bi.hwndOwner = NULL;
  450. bi.pszDisplayName = 0;
  451. bi.pidlRoot = 0;
  452. bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_USENEWUI;
  453. bi.lpfn = BrowseCallbackProc;
  454. bi.lParam = (long)(LPCTSTR)strDefault;
  455. pidl = SHBrowseForFolder(&bi);
  456. if (pidl) 
  457. {
  458. if (SHGetPathFromIDList(pidl,szDir)) 
  459. {
  460. strRet = szDir;
  461. strRet.TrimLeft();
  462. strRet.TrimRight();
  463. if (!strRet.IsEmpty())
  464. {
  465. if(strRet.GetAt(strRet.GetLength()-1)!='\')
  466. strRet +="\";
  467. }
  468. }
  469. pMalloc->Free(pidl); pMalloc->Release();
  470. }
  471. }
  472. return strRet.IsEmpty() == 0;
  473. }     
  474.  int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData) 
  475.  {
  476.  TCHAR szDir[MAX_PATH];
  477.  
  478.  switch(uMsg) 
  479.  {
  480.  case BFFM_INITIALIZED: 
  481.  {
  482.  if (pData)
  483.  {
  484.  SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)pData);
  485.  }
  486.  else if (GetCurrentDirectory(sizeof(szDir)/sizeof(TCHAR), szDir)) 
  487.  {
  488.  // WParam is TRUE since you are passing a path.
  489.  // It would be FALSE if you were passing a pidl.
  490.  SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)szDir);
  491.  }
  492.  break;
  493.  }
  494.  case BFFM_SELCHANGED: 
  495.  {
  496.  // Set the status window to the currently selected path.
  497.  if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir)) 
  498.  {
  499.  SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
  500.  }
  501.  break;
  502.  }
  503.  default:
  504.  break;
  505.  }
  506.  return 0;
  507.  }
  508.  //////////////////////////////////////////////////////////////////
  509.  //
  510.  // if find return the index. else return -1.
  511.  //
  512. int binary_search_ex (vector<long> array, int x) 
  513. {
  514. const int n =  array.size();
  515. int lo = 0, hi = n, mid = 0;
  516. while(lo != hi) 
  517. {
  518. mid = lo + (hi - lo) / 2;
  519. if (x == array[mid]) 
  520. return mid;
  521. if (x < array[mid]) 
  522. hi = mid; 
  523. else 
  524. lo = mid + 1;
  525. }
  526. return -1;
  527. }