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

DirextX编程

开发平台:

Visual C++

  1. // DelFileDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PFM.h"
  5. #include "DelFileDlg.h"
  6. #include "MainFrm.h"
  7. #include <direct.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDelFileDlg dialog
  15. CDelFileDlg::CDelFileDlg(CWnd* pParent /*=NULL*/)
  16. : CDialog(CDelFileDlg::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CDelFileDlg)
  19. // NOTE: the ClassWizard will add member initialization here
  20. //}}AFX_DATA_INIT
  21. }
  22. void CDelFileDlg::DoDataExchange(CDataExchange* pDX)
  23. {
  24. CDialog::DoDataExchange(pDX);
  25. //{{AFX_DATA_MAP(CDelFileDlg)
  26. // NOTE: the ClassWizard will add DDX and DDV calls here
  27. //}}AFX_DATA_MAP
  28. }
  29. BEGIN_MESSAGE_MAP(CDelFileDlg, CDialog)
  30. //{{AFX_MSG_MAP(CDelFileDlg)
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CDelFileDlg message handlers
  35. void CDelFileDlg::OnOK() 
  36. {
  37. // TODO: Add extra validation here
  38. CWaitCursor wc;
  39. GetDlgItem(IDOK)->EnableWindow(FALSE);
  40. GetDlgItem(IDCANCEL)->EnableWindow(FALSE);
  41. m_fl = gCurPan?gRightPan:gLeftPan;
  42. m_strPath = gCurPan?gRightPath:gLeftPath;
  43. if (m_strPath.Right(1) == "\")
  44. {
  45. DeleteD();
  46. m_fl->LoadDirectory(m_strPath);
  47. }
  48. else
  49. {
  50. DeleteF();
  51. m_fl->LoadFastfile(m_strPath);
  52. }
  53. CDialog::OnOK();
  54. }
  55. void CDelFileDlg::DeleteDir(LPCTSTR strPath)
  56. {
  57. CString sPath = strPath;
  58. CString curPath = sPath+"\";
  59. BOOL bLoop;
  60. CFileFind ff;
  61. bLoop = ff.FindFile(curPath+"*.*");
  62. while (bLoop)
  63. {
  64. bLoop = ff.FindNextFile();
  65. if (ff.IsDots())
  66. continue;
  67. if (ff.IsDirectory())
  68. DeleteDir(curPath+ff.GetFileName());
  69. else
  70. CFile::Remove(ff.GetFilePath());
  71. }
  72. _rmdir(sPath);
  73. }
  74. void CDelFileDlg::DeleteD()
  75. {
  76. LPWIN32_FIND_DATA pFd;
  77. char drive[_MAX_DRIVE];
  78. char dir[_MAX_DIR];
  79. char fname[_MAX_FNAME];
  80. char ext[_MAX_EXT];
  81. CString strName;
  82. int nItem = m_fl->GetNextItem(-1, LVNI_ALL|LVNI_SELECTED);
  83. while (nItem != -1)
  84. {
  85. pFd = (LPWIN32_FIND_DATA)m_fl->GetItemData(nItem);
  86. if (pFd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  87. {
  88. _splitpath(pFd->cFileName,drive,dir,fname,ext);
  89. strName = fname;
  90. strName += ext;
  91. if (strName == "..")
  92. ;
  93. else
  94. DeleteDir(strName);
  95. }
  96. else
  97. CFile::Remove(pFd->cFileName);
  98. nItem = m_fl->GetNextItem(nItem, LVNI_ALL|LVNI_SELECTED);
  99. }
  100. }
  101. void CDelFileDlg::DeleteF()
  102. {
  103. LPWIN32_FIND_DATA pFd;
  104. CString strDest = m_strPath.Left(
  105. m_strPath.ReverseFind('\')+1);
  106. LVITEM lvi;
  107. int nItem = m_fl->GetNextItem(-1, LVNI_ALL);
  108. while (nItem!=-1)
  109. {
  110. lvi.mask = LVIF_STATE;
  111. lvi.iItem = nItem;
  112. lvi.iSubItem = 0;
  113. lvi.stateMask = 0xFFFF;
  114. // get all state flags
  115. m_fl->GetItem(&lvi);
  116. if (lvi.state & LVIS_SELECTED)
  117. ;
  118. else
  119. {
  120. pFd = (LPWIN32_FIND_DATA)m_fl->GetItemData(nItem);
  121. if (pFd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  122. ;
  123. else
  124. m_map.SetAt(pFd->cFileName, pFd->cFileName);
  125. }
  126. nItem = m_fl->GetNextItem(nItem, LVNI_ALL);
  127. }
  128. CFile fPf;
  129. FILE_ENTRY *pFe;
  130. PACK_FILE_HEAD pfh;
  131. if (!fPf.Open(strDest+"$$$$$$$$.$$$", CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
  132. {
  133. MessageBox("包文件创建失败!","PackFile Maker", MB_OK|MB_ICONSTOP);
  134. return;
  135. }
  136. pfh.dwEntryCount = m_map.GetCount();
  137. memcpy(&pfh.dwFlag, "DXGF", 4);
  138. pfh.dwHeadSize = sizeof(PACK_FILE_HEAD);
  139. pfh.wMajorVersion = 0x1;
  140. pfh.wMinorVersion = 0x0;
  141. strcpy(pfh.szDescription, "This file is created by DirectX Guide");
  142. pFe = NULL;
  143. pFe = new FILE_ENTRY[pfh.dwEntryCount+1];
  144. if (pFe == NULL)
  145. {
  146. MessageBox("内存申请失败!", "PackFile Maker", MB_OK|MB_ICONSTOP);
  147. return;
  148. }
  149. DWORD dwCnt = 0;
  150. CString key, val;
  151. POSITION ps;
  152. ps = m_map.GetStartPosition();
  153. while (ps)
  154. {
  155. m_map.GetNextAssoc(ps, key, val);
  156. strcpy(pFe[dwCnt].szFileName, key);
  157. dwCnt++;
  158. }
  159. qsort(pFe, pfh.dwEntryCount, sizeof(FILE_ENTRY), Compare);
  160. LONG lOffset = sizeof(PACK_FILE_HEAD) + (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY);
  161. CFastFile fin;
  162. // DWORD dwSize = 0;
  163. for (dwCnt=0; dwCnt<pfh.dwEntryCount; dwCnt++)
  164. {
  165. if (!fin.Open(m_fl->GetFastFileManager(), pFe[dwCnt].szFileName))
  166. {
  167. MessageBox("文件打开失败!", "PackFile Maker", MB_OK|MB_ICONSTOP);
  168. fPf.Close();
  169. delete [] pFe;
  170. return;
  171. }
  172. pFe[dwCnt].lOffset = lOffset;
  173. memcpy(&(pFe[dwCnt].ftCreationTime), &(fin.m_pFE->ftCreationTime), sizeof(FILETIME));
  174. memcpy(&(pFe[dwCnt].ftWriteTime), &(fin.m_pFE->ftWriteTime), sizeof(FILETIME));
  175. fPf.Seek(lOffset, CFile::begin);
  176. fPf.Write(fin.GetPtr(), fin.GetFileSize());
  177. lOffset += fin.GetFileSize();
  178. // dwSize += fin.GetFileSize();
  179. }
  180. strcpy(pFe[pfh.dwEntryCount].szFileName, "-[The  End]-");
  181. pFe[pfh.dwEntryCount].lOffset = lOffset;
  182. pfh.dwFileSize = lOffset;
  183. fPf.Seek(0, CFile::begin);
  184. fPf.Write(&pfh, sizeof(pfh));
  185. fPf.Write(pFe, (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY));
  186. fPf.Close();
  187. delete [] pFe;
  188. m_fl->Unload();
  189. CFile::Remove(m_strPath);
  190. CFile::Rename(strDest+"$$$$$$$$.$$$", m_strPath);
  191. m_fl->LoadFastfile(m_strPath);
  192. }