CopyFilesDlg.cpp
上传用户:wymy58
上传日期:2007-01-07
资源大小:2086k
文件大小:14k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // CopyFilesDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include <direct.h>
  5. #include "PFM.h"
  6. #include "CopyFilesDlg.h"
  7. #include "MainFrm.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CCopyFilesDlg dialog
  15. CCopyFilesDlg::CCopyFilesDlg(CWnd* pParent /*=NULL*/)
  16. : CDialog(CCopyFilesDlg::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CCopyFilesDlg)
  19. //}}AFX_DATA_INIT
  20. }
  21. void CCopyFilesDlg::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialog::DoDataExchange(pDX);
  24. //{{AFX_DATA_MAP(CCopyFilesDlg)
  25. DDX_Control(pDX, IDC_STATIC2, m_prompt);
  26. DDX_Control(pDX, IDC_STATIC1, m_percent);
  27. DDX_Control(pDX, IDC_PROGRESS, m_prog);
  28. DDX_Control(pDX, IDC_ANIMATE, m_avi);
  29. //}}AFX_DATA_MAP
  30. }
  31. BEGIN_MESSAGE_MAP(CCopyFilesDlg, CDialog)
  32. //{{AFX_MSG_MAP(CCopyFilesDlg)
  33. //}}AFX_MSG_MAP
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CCopyFilesDlg message handlers
  37. BOOL CCopyFilesDlg::OnInitDialog() 
  38. {
  39. CDialog::OnInitDialog();
  40. // TODO: Add extra initialization here
  41. m_avi.ModifyStyle(WS_VISIBLE,0);
  42. m_prog.ModifyStyle(WS_VISIBLE,0);
  43. m_prompt.SetWindowText("是否要拷贝选择的文件?");
  44. return TRUE;  // return TRUE unless you set the focus to a control
  45.               // EXCEPTION: OCX Property Pages should return FALSE
  46. }
  47. void CCopyFilesDlg::OnOK() 
  48. {
  49. // TODO: Add extra validation here
  50. m_avi.ModifyStyle(0, WS_VISIBLE);
  51. m_prog.ModifyStyle(WS_BORDER, WS_VISIBLE);
  52. m_prompt.SetWindowText("");
  53. GetDlgItem(IDOK)->EnableWindow(FALSE);
  54. GetDlgItem(IDCANCEL)->EnableWindow(FALSE);
  55. m_avi.Open(IDR_FILECOPY);
  56. m_avi.Play(0, -1, -1);
  57. if (gCurPan)
  58. {
  59. m_flSrc = gRightPan; m_strSrc = gRightPath;
  60. m_flDest = gLeftPan; m_strDest = gLeftPath;
  61. }
  62. else
  63. {
  64. m_flSrc = gLeftPan; m_strSrc = gLeftPath;
  65. m_flDest = gRightPan; m_strDest = gRightPath;
  66. }
  67. if (m_flSrc->GetFastFileManager())
  68. {
  69. if (m_flDest->GetFastFileManager())
  70. CopyFF();
  71. else
  72. CopyFD();
  73. }
  74. else
  75. {
  76. if (m_flDest->GetFastFileManager())
  77. CopyDF();
  78. else
  79. CopyDD();
  80. }
  81. CDialog::OnOK();
  82. }
  83. void CCopyFilesDlg::SearchDirectory(LPCTSTR strPath, BOOL bCreateDest)
  84. {
  85. CString curPath, strName;
  86. char drive[_MAX_DRIVE];
  87. char dir[_MAX_DIR];
  88. char fname[_MAX_FNAME];
  89. char ext[_MAX_EXT];
  90. if (bCreateDest)
  91. {
  92. curPath = m_strDest + strPath;
  93. _mkdir(curPath);
  94. }
  95. curPath = strPath;
  96. curPath += "\";
  97. BOOL bLoop;
  98. char sName[MAX_PATH];
  99. CFileFind ff;
  100. bLoop = ff.FindFile(curPath+"*.*");
  101. while (bLoop)
  102. {
  103. bLoop = ff.FindNextFile();
  104. strName = ff.GetFileName();
  105. if (ff.IsDots())
  106. continue;
  107. if (ff.IsDirectory())
  108. SearchDirectory(curPath+strName, bCreateDest);
  109. else
  110. {
  111. GetShortPathName(m_strSrc+curPath+strName, sName,MAX_PATH);
  112. _splitpath(sName,drive,dir,fname,ext);
  113. strName = fname;
  114. strName += ext;
  115. m_map.SetAt(strName, ff.GetFilePath());
  116. m_dwSize += ff.GetLength();
  117. }
  118. }
  119. }
  120. void CCopyFilesDlg::UpdateProg(DWORD dwSize)
  121. {
  122. DWORD dwPct = 100*dwSize/m_dwSize;
  123. m_prog.SetPos(dwPct);
  124. CString strPct;
  125. strPct.Format("%d%%", dwPct);
  126. m_percent.SetWindowText(strPct);
  127. }
  128. void CCopyFilesDlg::CopyFF()
  129. {
  130. LPWIN32_FIND_DATA pFd;
  131. LVITEM lvi;
  132. CFastFileManager *pFfmSrc = m_flSrc->GetFastFileManager();
  133. CFastFileManager *pFfmDest = m_flDest->GetFastFileManager();
  134. m_map.RemoveAll();
  135. m_dwSize = 0;
  136. // add src list items
  137. int nItem = m_flSrc->GetNextItem(-1, LVNI_ALL|LVNI_SELECTED);
  138. while (nItem != -1)
  139. {
  140. pFd = (LPWIN32_FIND_DATA)m_flSrc->GetItemData(nItem);
  141. if (pFd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  142. ;
  143. else
  144. {
  145. m_map.SetAt(pFd->cFileName, "Src");
  146. m_dwSize += pFd->nFileSizeLow;
  147. }
  148. lvi.mask = LVIF_STATE;
  149. lvi.iItem = nItem;
  150. lvi.iSubItem = 0;
  151. lvi.stateMask = 0xFFFF;
  152. // get all state flags
  153. m_flSrc->GetItem(&lvi);
  154. lvi.state ^= LVIS_SELECTED;
  155. m_flSrc->SetItem(&lvi);
  156. nItem = m_flSrc->GetNextItem(nItem, LVNI_ALL|LVNI_SELECTED);
  157. }
  158. // add Dest list items
  159. nItem = m_flDest->GetNextItem(-1, LVNI_ALL);
  160. while (nItem != -1)
  161. {
  162. pFd = (LPWIN32_FIND_DATA)m_flDest->GetItemData(nItem);
  163. if (pFd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  164. ;
  165. else
  166. {
  167. m_map.SetAt(pFd->cFileName, "Dest");
  168. m_dwSize += pFd->nFileSizeLow;
  169. }
  170. nItem = m_flDest->GetNextItem(nItem, LVNI_ALL);
  171. }
  172. CString strDest = m_strDest.Left(
  173. m_strDest.ReverseFind('\')+1);
  174. CFile fPf;
  175. FILE_ENTRY *pFe;
  176. PACK_FILE_HEAD pfh;
  177. if (!fPf.Open(strDest+"$$$$$$$$.$$$", CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
  178. {
  179. MessageBox("包文件创建失败!","PackFile Maker", MB_OK|MB_ICONSTOP);
  180. return;
  181. }
  182. pfh.dwEntryCount = m_map.GetCount();
  183. memcpy(&pfh.dwFlag, "DXGF", 4);
  184. pfh.dwHeadSize = sizeof(PACK_FILE_HEAD);
  185. pfh.wMajorVersion = 0x1;
  186. pfh.wMinorVersion = 0x0;
  187. strcpy(pfh.szDescription, "This file is created by DirectX Guide");
  188. pFe = NULL;
  189. pFe = new FILE_ENTRY[pfh.dwEntryCount+1];
  190. if (pFe == NULL)
  191. {
  192. MessageBox("内存申请失败!", "PackFile Maker", MB_OK|MB_ICONSTOP);
  193. return;
  194. }
  195. DWORD dwCnt = 0;
  196. CString key, val;
  197. POSITION ps;
  198. ps = m_map.GetStartPosition();
  199. while (ps)
  200. {
  201. m_map.GetNextAssoc(ps, key, val);
  202. strcpy(pFe[dwCnt].szFileName, key);
  203. dwCnt++;
  204. }
  205. qsort(pFe, pfh.dwEntryCount, sizeof(FILE_ENTRY), Compare);
  206. LONG lOffset = sizeof(PACK_FILE_HEAD) + (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY);
  207. CFastFile fin;
  208. DWORD dwSize = 0;
  209. for (dwCnt=0; dwCnt<pfh.dwEntryCount; dwCnt++)
  210. {
  211. if(!m_map.Lookup(pFe[dwCnt].szFileName, val))
  212. {
  213. MessageBox("文件目录出错!", "PackFile Maker");
  214. delete [] pFe;
  215. return;
  216. }
  217. if (!fin.Open(val=="Src"?pFfmSrc:pFfmDest, pFe[dwCnt].szFileName))
  218. {
  219. MessageBox("文件打开失败!", "PackFile Maker", MB_OK|MB_ICONSTOP);
  220. fPf.Close();
  221. delete [] pFe;
  222. return;
  223. }
  224. pFe[dwCnt].lOffset = lOffset;
  225. memcpy(&(pFe[dwCnt].ftCreationTime), &(fin.m_pFE->ftCreationTime), sizeof(FILETIME));
  226. memcpy(&(pFe[dwCnt].ftWriteTime), &(fin.m_pFE->ftWriteTime), sizeof(FILETIME));
  227. // strcpy(pFe[dwCnt].szFileName, key);
  228. fPf.Seek(lOffset, CFile::begin);
  229. fPf.Write(fin.GetPtr(), fin.GetFileSize());
  230. lOffset += fin.GetFileSize();
  231. dwSize += fin.GetFileSize();
  232. UpdateProg(dwSize);
  233. //fin.Close();
  234. }
  235. strcpy(pFe[pfh.dwEntryCount].szFileName, "-[The  End]-");
  236. pFe[pfh.dwEntryCount].lOffset = lOffset;
  237. pfh.dwFileSize = lOffset;
  238. fPf.Seek(0, CFile::begin);
  239. fPf.Write(&pfh, sizeof(pfh));
  240. fPf.Write(pFe, (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY));
  241. fPf.Close();
  242. delete [] pFe;
  243. m_flDest->Unload();
  244. CFile::Remove(m_strDest);
  245. CFile::Rename(strDest+"$$$$$$$$.$$$", m_strDest);
  246. m_flSrc->LoadFastfile(m_strSrc);
  247. m_flDest->LoadFastfile(m_strDest);
  248. }
  249. void CCopyFilesDlg::CopyFD()
  250. {
  251. LPWIN32_FIND_DATA pFd;
  252. LVITEM lvi;
  253. m_dwSize = 0;
  254. m_map.RemoveAll();
  255. int nItem = m_flSrc->GetNextItem(-1, LVNI_ALL|LVNI_SELECTED);
  256. while (nItem != -1)
  257. {
  258. pFd = (LPWIN32_FIND_DATA)m_flSrc->GetItemData(nItem);
  259. m_dwSize += pFd->nFileSizeLow;
  260. m_map.SetAt(pFd->cFileName, "");
  261. lvi.mask = LVIF_STATE;
  262. lvi.iItem = nItem;
  263. lvi.iSubItem = 0;
  264. lvi.stateMask = 0xFFFF;
  265. // get all state flags
  266. m_flSrc->GetItem(&lvi);
  267. lvi.state ^= LVIS_SELECTED;
  268. m_flSrc->SetItem(&lvi);
  269. nItem = m_flSrc->GetNextItem(nItem, LVNI_ALL|LVNI_SELECTED);
  270. }
  271. CFastFile fin;
  272. CFile fout;
  273. DWORD dwSize = 0;
  274. CString key, val;
  275. POSITION ps;
  276. ps = m_map.GetStartPosition();
  277. while (ps)
  278. {
  279. m_map.GetNextAssoc(ps, key, val);
  280. if (fin.Open(m_flSrc->GetFastFileManager(), key))
  281. if (fout.Open(m_strDest+key, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
  282. fout.Write(fin.GetPtr(), fin.GetFileSize());
  283. SetFileTime((HANDLE)fout.m_hFile, &(fin.m_pFE->ftCreationTime),
  284. &(fin.m_pFE->ftWriteTime), &(fin.m_pFE->ftWriteTime));
  285. fout.Close();
  286. dwSize += fin.GetFileSize();
  287. UpdateProg(dwSize);
  288. }
  289. m_flSrc->LoadFastfile(m_strSrc);
  290. m_flDest->LoadDirectory(m_strDest);
  291. }
  292. void CCopyFilesDlg::CopyDF()
  293. {
  294. char buf[1024];
  295. FILETIME ft;
  296. LPWIN32_FIND_DATA pFd;
  297. CFastFileManager *pFfmSrc = m_flSrc->GetFastFileManager();
  298. CFastFileManager *pFfmDest = m_flDest->GetFastFileManager();
  299. m_map.RemoveAll();
  300. m_dwSize = 0;
  301. // add Dest list items
  302. int nItem = m_flDest->GetNextItem(-1, LVNI_ALL);
  303. while (nItem != -1)
  304. {
  305. pFd = (LPWIN32_FIND_DATA)m_flDest->GetItemData(nItem);
  306. if (pFd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  307. ;
  308. else
  309. {
  310. m_map.SetAt(pFd->cFileName, "nDestn");
  311. m_dwSize += pFd->nFileSizeLow;
  312. }
  313. nItem = m_flDest->GetNextItem(nItem, LVNI_ALL);
  314. }
  315. char drive[_MAX_DRIVE];
  316. char dir[_MAX_DIR];
  317. char fname[_MAX_FNAME];
  318. char ext[_MAX_EXT];
  319. CString strName;
  320. LVITEM lvi;
  321. char sPath[14];
  322. nItem = m_flSrc->GetNextItem(-1, LVNI_ALL|LVNI_SELECTED);
  323. while (nItem != -1)
  324. {
  325. pFd = (LPWIN32_FIND_DATA)m_flSrc->GetItemData(nItem);
  326. _splitpath(pFd->cFileName,drive,dir,fname,ext);
  327. strName = fname;
  328. strName += ext;
  329. if (pFd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  330. {
  331. if (strName != "..")
  332. SearchDirectory(strName, FALSE);
  333. }
  334. else
  335. {
  336. GetShortPathName(strName, sPath,14);
  337. m_map.SetAt(sPath, (gCurPan?gRightPath:gLeftPath)+strName);
  338. }
  339. lvi.mask = LVIF_STATE;
  340. lvi.iItem = nItem;
  341. lvi.iSubItem = 0;
  342. lvi.stateMask = 0xFFFF;
  343. // get all state flags
  344. m_flSrc->GetItem(&lvi);
  345. lvi.state ^= LVIS_SELECTED;
  346. m_flSrc->SetItem(&lvi);
  347. //SetItemState( nItem,LVIS_SELECTED , LVIS_SELECTED);
  348. nItem = m_flSrc->GetNextItem(nItem, LVNI_ALL|LVNI_SELECTED);
  349. }
  350. CString strDest = m_strDest.Left(
  351. m_strDest.ReverseFind('\')+1);
  352. CFile fPf;
  353. FILE_ENTRY *pFe;
  354. PACK_FILE_HEAD pfh;
  355. if (!fPf.Open(strDest+"$$$$$$$$.$$$", CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
  356. {
  357. MessageBox("包文件创建失败!","PackFile Maker", MB_OK|MB_ICONSTOP);
  358. return;
  359. }
  360. pfh.dwEntryCount = m_map.GetCount();
  361. memcpy(&pfh.dwFlag, "DXGF", 4);
  362. pfh.dwHeadSize = sizeof(PACK_FILE_HEAD);
  363. pfh.wMajorVersion = 0x1;
  364. pfh.wMinorVersion = 0x0;
  365. strcpy(pfh.szDescription, "This file is created by DirectX Guide");
  366. pFe = NULL;
  367. pFe = new FILE_ENTRY[pfh.dwEntryCount+1];
  368. if (pFe == NULL)
  369. {
  370. MessageBox("内存申请失败!", "PackFile Maker", MB_OK|MB_ICONSTOP);
  371. return;
  372. }
  373. DWORD dwCnt = 0;
  374. CString key, val;
  375. POSITION ps;
  376. ps = m_map.GetStartPosition();
  377. while (ps)
  378. {
  379. m_map.GetNextAssoc(ps, key, val);
  380. strcpy(pFe[dwCnt].szFileName, key);
  381. dwCnt++;
  382. }
  383. qsort(pFe, pfh.dwEntryCount, sizeof(FILE_ENTRY), Compare);
  384. LONG lOffset = sizeof(PACK_FILE_HEAD) + (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY);
  385. CFile fin;
  386. CFastFile ffin;
  387. DWORD dwSize = 0;
  388. for (dwCnt=0; dwCnt<pfh.dwEntryCount; dwCnt++)
  389. {
  390. if(!m_map.Lookup(pFe[dwCnt].szFileName, val))
  391. {
  392. MessageBox("文件目录出错!", "PackFile Maker");
  393. delete [] pFe;
  394. return;
  395. }
  396. if (val == "nDestn")
  397. {
  398. if (!ffin.Open(val=="Src"?pFfmSrc:pFfmDest, pFe[dwCnt].szFileName))
  399. {
  400. MessageBox("文件打开失败!", "PackFile Maker", MB_OK|MB_ICONSTOP);
  401. fPf.Close();
  402. delete [] pFe;
  403. return;
  404. }
  405. pFe[dwCnt].lOffset = lOffset;
  406. memcpy(&(pFe[dwCnt].ftCreationTime), &(ffin.m_pFE->ftCreationTime), sizeof(FILETIME));
  407. memcpy(&(pFe[dwCnt].ftWriteTime), &(ffin.m_pFE->ftWriteTime), sizeof(FILETIME));
  408. fPf.Seek(lOffset, CFile::begin);
  409. fPf.Write(ffin.GetPtr(), ffin.GetFileSize());
  410. lOffset += ffin.GetFileSize();
  411. dwSize += ffin.GetFileSize();
  412. }
  413. else
  414. {
  415. if (!fin.Open(val, CFile::modeRead|CFile::shareDenyNone|CFile::typeBinary))
  416. {
  417. MessageBox("文件打开失败!", "PackFile Maker", MB_OK|MB_ICONSTOP);
  418. fPf.Close();
  419. delete [] pFe;
  420. return;
  421. }
  422. pFe[dwCnt].lOffset = lOffset;
  423. GetFileTime((HANDLE)fin.m_hFile, &(pFe[dwCnt].ftCreationTime), &ft, &(pFe[dwCnt].ftWriteTime));
  424. fPf.Seek(lOffset, CFile::begin);
  425. int nRead;
  426. do
  427. {
  428. nRead = fin.Read(buf, 1024);
  429. fPf.Write(buf, nRead);
  430. }while (nRead == 1024);
  431. lOffset += fin.GetLength();
  432. dwSize += fin.GetLength();
  433. fin.Close();
  434. }
  435. UpdateProg(dwSize);
  436. }
  437. strcpy(pFe[pfh.dwEntryCount].szFileName, "-[The  End]-");
  438. pFe[pfh.dwEntryCount].lOffset = lOffset;
  439. pfh.dwFileSize = lOffset;
  440. fPf.Seek(0, CFile::begin);
  441. fPf.Write(&pfh, sizeof(pfh));
  442. fPf.Write(pFe, (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY));
  443. fPf.Close();
  444. delete [] pFe;
  445. m_flDest->Unload();
  446. CFile::Remove(m_strDest);
  447. CFile::Rename(strDest+"$$$$$$$$.$$$", m_strDest);
  448. m_flSrc->LoadDirectory(m_strSrc);
  449. m_flDest->LoadFastfile(m_strDest);
  450. }
  451. void CCopyFilesDlg::CopyDD()
  452. {
  453. LPWIN32_FIND_DATA pFd;
  454. DWORD dwSize = 0;
  455. LVITEM lvi;
  456. char drive[_MAX_DRIVE];
  457. char dir[_MAX_DIR];
  458. char fname[_MAX_FNAME];
  459. char ext[_MAX_EXT];
  460. char buf[1024];
  461. CString strName;
  462. m_map.RemoveAll();
  463. m_dwSize = 0;
  464. int nItem = m_flSrc->GetNextItem(-1, LVNI_ALL|LVNI_SELECTED);
  465. while (nItem!=-1)
  466. {
  467. pFd = (LPWIN32_FIND_DATA)m_flSrc->GetItemData(nItem);
  468. _splitpath(pFd->cFileName,drive,dir,fname,ext);
  469. strName = fname;
  470. strName += ext;
  471. if (pFd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  472. {
  473. if (strName != "..")
  474. SearchDirectory(strName, TRUE);
  475. }
  476. else
  477. {
  478. m_map.SetAt(strName, strName);
  479. m_dwSize += pFd->nFileSizeLow;
  480. }
  481. lvi.mask = LVIF_STATE;
  482. lvi.iItem = nItem;
  483. lvi.iSubItem = 0;
  484. lvi.stateMask = 0xFFFF;
  485. // get all state flags
  486. m_flSrc->GetItem(&lvi);
  487. lvi.state ^= LVIS_SELECTED;
  488. m_flSrc->SetItem(&lvi);
  489. nItem = m_flSrc->GetNextItem(nItem, LVNI_ALL|LVNI_SELECTED);
  490. }
  491. DWORD dwCnt = 0;
  492. CFile fin, fout;
  493. CString key, val;
  494. POSITION ps;
  495. ps = m_map.GetStartPosition();
  496. while (ps)
  497. {
  498. m_map.GetNextAssoc(ps, key, val);
  499. if (fin.Open(m_strSrc+val, CFile::modeRead|CFile::shareDenyNone|CFile::typeBinary))
  500. {
  501. if (fout.Open(m_strDest+val, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
  502. {
  503. int nRead;
  504. do
  505. {
  506. nRead = fin.Read(buf, 1024);
  507. fout.Write(buf, nRead);
  508. dwSize += nRead;
  509. UpdateProg(dwSize);
  510. }while (nRead == 1024);
  511. CFileStatus status;
  512. fin.GetStatus(status);
  513. fin.Close();
  514. fout.Close();
  515. CFile::SetStatus(m_strDest+val, status);
  516. }
  517. }
  518. }
  519. }
  520. void CCopyFilesDlg::OnCancel() 
  521. {
  522. // TODO: Add extra cleanup here
  523. CDialog::OnCancel();
  524. }