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

DirextX编程

开发平台:

Visual C++

  1. // Written by FangHong, 1998
  2. // Based DX5SDK samples "FastFile"
  3. /*
  4. Jun-03-1998, change compare() to direct compare names.
  5. Jun-02-1998, first version.
  6. */
  7. #include "stdafx.h"
  8. #include "FastFileManager.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. CFastFileManager::CFastFileManager(void)
  15. {
  16. m_hFileMapping = NULL;
  17. m_hFile = NULL;
  18. m_pBase = NULL;
  19. ZeroMemory(&m_head, sizeof(PACK_FILE_HEAD));
  20. m_aFileEntry = NULL;
  21. }
  22. // Initialize for fast file access.
  23. // The master file are specified.
  24. // get a file handle array
  25. BOOL CFastFileManager::Create(LPCTSTR  lpstrName)
  26. {
  27. // try our resourse file first
  28. HRSRC h;
  29. if (h = ::FindResource(NULL, lpstrName, RT_RCDATA))
  30. {
  31. m_pBase = (BYTE*)::LockResource(::LoadResource(NULL, h));
  32. if (m_pBase == NULL)
  33. {
  34. TRACE0( "FastFileInit: unable to lock resourcen" );
  35. return  FALSE;
  36. }
  37. TRACE1("FastFileInit: opened resource: %s n", lpstrName);
  38. }
  39. else   
  40. {
  41. // create a memory mapped file for the master file
  42. m_hFile = ::CreateFile(lpstrName, GENERIC_READ,
  43. FILE_SHARE_READ, NULL,
  44. OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, 0);
  45. if (m_hFile == NULL || m_hFile == (HANDLE)HFILE_ERROR)
  46. {
  47. TRACE1("FastFileInit: CreateFile(%s)n", lpstrName);
  48. m_hFile = NULL;
  49. return  FALSE;
  50. }
  51. m_hFileMapping = ::CreateFileMapping(m_hFile, NULL, PAGE_READONLY, 0, 0, NULL);
  52. if (m_hFileMapping == NULL)
  53. {
  54. TRACE0( "FastFileInit: CreateFileMapping Failedn" );
  55. return  FALSE;
  56. }
  57. m_pBase = (BYTE*)::MapViewOfFile(m_hFileMapping, FILE_MAP_READ, 0, 0, 0);
  58. if (m_pBase == NULL)
  59. {
  60. TRACE0( "FastFileInit: MapViewOfFile Failedn" );
  61. return  FALSE;
  62. }
  63. }
  64. // get initial data from the memory mapped file
  65. m_head = *((PACK_FILE_HEAD*)m_pBase);
  66. m_aFileEntry = (FILE_ENTRY*)(m_pBase + sizeof(PACK_FILE_HEAD));
  67. return  TRUE;
  68. }
  69. // Clean up resources
  70. CFastFileManager::~CFastFileManager(void)
  71. {
  72. // dont unmap things if we have locks out standing
  73. if (m_hFileMapping != NULL && m_pBase)
  74. {
  75. ::UnmapViewOfFile(m_pBase);
  76. }
  77. if (m_hFileMapping != NULL)
  78. {
  79. ::CloseHandle(m_hFileMapping);
  80. m_hFileMapping = NULL;
  81. }
  82. if (m_hFile != NULL)
  83. {
  84. ::CloseHandle(m_hFile);
  85. m_hFile = NULL;
  86. }
  87. }
  88. // Search the directory for the file, and return a file handle if found.
  89. FILE_ENTRY* CFastFileManager::GetFileEntryInfo(LPCSTR  lpstrName)
  90. {
  91. ASSERT(m_aFileEntry != NULL);
  92. ASSERT(lpstrName != NULL && lpstrName[0] != 0);
  93. FILE_ENTRY* pfe = (FILE_ENTRY*)::bsearch(/*&fe*/lpstrName, m_aFileEntry, m_head.dwEntryCount, sizeof(FILE_ENTRY), CFastFileManager::Compare);
  94. return  pfe;
  95. }
  96. // bsearch comparison routine
  97. int AFX_CDECL CFastFileManager::Compare(const void*  p1, const void*  p2)
  98. {
  99. return  (::_stricmp((LPCSTR)p1, ((FILE_ENTRY*)(p2))->szFileName));
  100. }