DBDumpLoad.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // DBDumpLoad.cpp: implementation of the CDBDump class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include <io.h>
  6. #include "DBDumpLoad.h"
  7. ////////CDBDump////////////////////////////////////////////////////////////////////////////
  8. CDBDump::CDBDump()
  9. {
  10. memset(m_FilePath,0,MAX_PATH);
  11. m_output = NULL;
  12. m_IsOpened = false;
  13. }
  14. bool CDBDump::Open(char* aFilePath)
  15. {//打开包文件
  16. if(m_IsOpened)return false;
  17. _finddata_t FindData;
  18. long aFileFound =_findfirst(aFilePath, &FindData);
  19. if(aFileFound != -1)return false; //如果该文件存在就返回不成功
  20. m_output = fopen(aFilePath, "wb");
  21. if(!m_output)return false; //如果打开该文件失败就返回不成功
  22. strcpy(m_FilePath,aFilePath);
  23. m_IsOpened = true;
  24. return true;
  25. }
  26. bool CDBDump::Close()
  27. {//保存包文件
  28. if(!m_IsOpened) return false;
  29. if(fclose(m_output)) return false;
  30. memset(m_FilePath,0,MAX_PATH);
  31. m_output = NULL;
  32. m_IsOpened = false;
  33. return true;
  34. }
  35. bool CDBDump::AddData(char* key, const size_t keysize, char *aData, const size_t size)
  36. {//添加文件
  37. if(!m_IsOpened) return false;
  38. unsigned long offset = ftell(m_output);
  39. if(fwrite(&keysize, sizeof(size_t), 1, m_output) != 1)
  40. {
  41. fseek(m_output, offset, SEEK_SET);
  42. return false;
  43. }
  44. if(fwrite(key, 1, keysize, m_output) != keysize)
  45. {
  46. fseek(m_output, offset, SEEK_SET);
  47. return false;
  48. }
  49. if(fwrite(&size, sizeof(size_t), 1, m_output) != 1)
  50. {
  51. fseek(m_output, offset, SEEK_SET);
  52. return false;
  53. }
  54. if(fwrite(aData, 1, size, m_output) != size)
  55. {
  56. fseek(m_output, offset, SEEK_SET);
  57. return false;
  58. }
  59. return true;
  60. }
  61. ////////CDBLoad////////////////////////////////////////////////////////////////////////////
  62. CDBLoad::CDBLoad()
  63. {
  64. memset(m_FilePath,0,MAX_PATH);
  65. m_output = NULL;
  66. m_IsOpened = false;
  67. }
  68. bool CDBLoad::Open(char* aFilePath)
  69. {//打开包文件
  70. if(m_IsOpened)return false;
  71. _finddata_t FindData;
  72. long aFileFound =_findfirst(aFilePath, &FindData);
  73. if(aFileFound == -1)return false; //如果该文件不存在就返回不成功
  74. m_output = fopen(aFilePath, "rb");
  75. if(!m_output)return false; //如果打开该文件失败就返回不成功
  76. strcpy(m_FilePath,aFilePath);
  77. m_IsOpened = true;
  78. return true;
  79. }
  80. bool CDBLoad::Close()
  81. {//保存包文件
  82. if(!m_IsOpened) return false;
  83. if(fclose(m_output)) return false;
  84. memset(m_FilePath,0,MAX_PATH);
  85. m_output = NULL;
  86. m_IsOpened = false;
  87. return true;
  88. }
  89. bool CDBLoad::ReadData(char* key, size_t& keysize, char *aData, size_t& size)
  90. {//添加文件
  91. if(!m_IsOpened) return false;
  92. if(fread(&keysize, sizeof(size_t), 1, m_output) != 1)
  93. return false;
  94. if(fread(key, 1, keysize, m_output) != keysize)
  95. return false;
  96. if(fread(&size, sizeof(size_t), 1, m_output) != 1)
  97. return false;
  98. if(fread(aData, 1, size, m_output) != size)
  99. return false;
  100. return true;
  101. }
  102. void CDBLoad::GotoHead()
  103. {//把文件指针移动到文件头
  104. if(!m_IsOpened) return;
  105. if(m_output)
  106. fseek(m_output, 0, SEEK_SET);
  107. }
  108. bool CDBLoad::SearchData(char* key, char *aData, size_t& size)
  109. {//搜索数据
  110. GotoHead(); //把文件指针移动到文件头
  111. char aBuffer[64 * 1024] = {0};
  112. char aKeyBuffer[32] = {0};
  113. size_t asize,akeysize;
  114. while(ReadData(aKeyBuffer,akeysize,aBuffer,asize))
  115. {
  116. if(strcmp(key, aKeyBuffer) == 0)
  117. {
  118. memcpy(aData, aBuffer, size);
  119. size = asize;
  120. return true;
  121. }
  122. }
  123. return false;
  124. }