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

DirextX编程

开发平台:

Visual C++

  1. // FFM.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include "FFM.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // The one and only application object
  12. CWinApp theApp;
  13. using namespace std;
  14. void Usage();
  15. FILE_ENTRY *pFe;
  16. CFile fPf;
  17. PACK_FILE_HEAD pfh;
  18. int Compare(const void*  p1, const void*  p2)
  19. {
  20. return  (_stricmp(((FILE_ENTRY*)(p1))->szFileName, ((FILE_ENTRY*)(p2))->szFileName));
  21. }
  22. int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
  23. {
  24. int nRetCode = 0;
  25. // initialize MFC and print and error on failure
  26. if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
  27. {
  28. // TODO: change error code to suit your needs
  29. cerr << _T("Fatal Error: MFC initialization failed") << endl;
  30. nRetCode = 1;
  31. }
  32. else
  33. {
  34. // TODO: code your application's behavior here.
  35. char buf[1024];
  36. CString strHello;
  37. strHello.LoadString(IDS_HELLO);
  38. cout << (LPCTSTR)strHello << endl;
  39. if (argc < 3)
  40. Usage();
  41. else
  42. {
  43. cout << "Counting matched files......";
  44. pfh.dwEntryCount = 0;
  45. CFileFind ff;
  46. BOOL bFound = ff.FindFile(argv[1]);
  47. while (bFound)
  48. {
  49. bFound = ff.FindNextFile();
  50. if (!ff.IsDirectory())
  51. pfh.dwEntryCount++;
  52. }
  53. ff.Close();
  54. cout << "OK!" << endl;
  55. if (pfh.dwEntryCount == 0)
  56. {
  57. cout << "matching file " << argv[1] << " not found, program terminated!" << endl;
  58. return 0;
  59. }
  60. cout << "loading file infomation......";
  61. pFe = NULL;
  62. pFe = new FILE_ENTRY[pfh.dwEntryCount+1];
  63. if (pFe == NULL)
  64. {
  65. cout << endl << "no enough memory to load all file infomation, terminated!" << endl;
  66. return -1;
  67. }
  68. DWORD dwCnt = 0;
  69. bFound = ff.FindFile(argv[1]);
  70. while (bFound)
  71. {
  72. bFound = ff.FindNextFile();
  73. if (!ff.IsDirectory())
  74. {
  75. GetShortPathName(ff.GetFileName(), pFe[dwCnt].szFileName, 13);
  76. pFe[dwCnt].lOffset = ff.GetLength();
  77. ff.GetCreationTime(&pFe[dwCnt].ftCreationTime);
  78. ff.GetLastWriteTime(&pFe[dwCnt].ftWriteTime);
  79. dwCnt++;
  80. }
  81. }
  82. ASSERT(dwCnt = pfh.dwEntryCount);
  83. ff.Close();
  84. memcpy(&pfh.dwFlag, "DGFF", 4);
  85. pfh.dwHeadSize = sizeof(PACK_FILE_HEAD);
  86. pfh.wMajorVersion = 0x1;
  87. pfh.wMinorVersion = 0x0;
  88. strcpy(pfh.szDescription, "This file is created by DirectX Guide");
  89. strcpy(pFe[pfh.dwEntryCount].szFileName, "[The End]");
  90. cout << "OK!" << endl;
  91. cout << "Sorting file entries......";
  92. qsort(pFe, pfh.dwEntryCount, sizeof(FILE_ENTRY), Compare);
  93. cout << "OK!" << endl;
  94. cout << "Creating PackFile......";
  95. if (!fPf.Open(argv[2], CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
  96. {
  97. cout << "can't create file " << argv[2] << ", terminated!" << endl;
  98. delete [] pFe;
  99. return -1;
  100. }
  101. CFile fin;
  102. LONG lOffset = sizeof(PACK_FILE_HEAD) + (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY);
  103. for (dwCnt = 0; dwCnt < pfh.dwEntryCount; dwCnt++)
  104. {
  105. if (!fin.Open(pFe[dwCnt].szFileName, CFile::modeRead|CFile::typeBinary))
  106. {
  107. cout << "can't open file " << pFe[dwCnt].szFileName << " for reading, terminated!" << endl;
  108. fPf.Close();
  109. delete [] pFe;
  110. return -1;
  111. }
  112. pFe[dwCnt].lOffset = lOffset;
  113. fPf.Seek(lOffset, CFile::begin);
  114. int nRead;
  115. do
  116. {
  117. nRead = fin.Read(buf, 1024);
  118. fPf.Write(buf, nRead);
  119. }while (nRead == 1024);
  120. lOffset += fin.GetLength();
  121. fin.Close();
  122. }
  123. pFe[pfh.dwEntryCount].lOffset = lOffset;
  124. pfh.dwFileSize = lOffset;
  125. fPf.Seek(0, CFile::begin);
  126. fPf.Write(&pfh, sizeof(pfh));
  127. fPf.Write(pFe, (pfh.dwEntryCount+1)*sizeof(FILE_ENTRY));
  128. fPf.Close();
  129. cout << "OK!" << endl;
  130. }
  131. }
  132. return nRetCode;
  133. }
  134. void Usage()
  135. {
  136. CString strHelp;
  137. strHelp.LoadString(IDS_HELP);
  138. cout << (LPCTSTR)strHelp << endl;
  139. }