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

模拟服务器

开发平台:

C/C++

  1. // LogFile.cpp: implementation of the CLogFile class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "LogFile.h"
  6. #include "assert.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. const char dirsuffix_log[] = "";
  14. const char filesuffix_log[] = ".log";
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CLogFile::CLogFile()
  19. : m_threshold(0), m_lBatch(0), m_hFile(INVALID_HANDLE_VALUE)
  20. {
  21. }
  22. CLogFile::~CLogFile()
  23. {
  24. assert(m_threshold == 0);
  25. }
  26. BOOL CLogFile::Initialize(const std::string& root, size_t threshold)
  27. {
  28. if (m_threshold != 0)
  29. return FALSE;
  30. if (threshold == 0)
  31. return FALSE;
  32. std::string strRoot = root;
  33. if (!strRoot.empty())
  34. {
  35. if (*strRoot.rbegin() != CH_SEPARATOR)
  36. strRoot += CH_SEPARATOR;
  37. DWORD attr = ::GetFileAttributes(strRoot.c_str());
  38. if (attr == -1 || !(attr & FILE_ATTRIBUTE_DIRECTORY))
  39. return FALSE;
  40. }
  41. m_strRoot = strRoot;
  42. m_threshold = threshold;
  43. return TRUE;
  44. }
  45. BOOL CLogFile::Uninitialize()
  46. {
  47. if (m_hFile != INVALID_HANDLE_VALUE)
  48. {
  49. ::CloseHandle(m_hFile);
  50. m_hFile = NULL;
  51. }
  52. m_lBatch = 0;
  53. m_threshold = 0;
  54. m_strRoot.resize(0);
  55. return TRUE;
  56. }
  57. size_t CLogFile::TraceLog(const void* pData, size_t size)
  58. {
  59. if (m_threshold == 0)
  60. return 0;
  61. if (!PrepareFile() && m_hFile == INVALID_HANDLE_VALUE)
  62. return FALSE;
  63. DWORD writesize = 0;
  64. if (!::WriteFile(m_hFile, pData, size, &writesize, NULL))
  65. return 0;
  66. return writesize;
  67. }
  68. BOOL CLogFile::PrepareFile()
  69. {
  70. assert(m_threshold != 0);
  71. if (m_hFile != INVALID_HANDLE_VALUE)
  72. {
  73. if (m_lBatch)
  74. return TRUE;
  75. if (m_threshold == -1)
  76. return TRUE;
  77. DWORD hisize = 0;
  78. DWORD losize = ::GetFileSize(m_hFile, &hisize);
  79. if (hisize <= 0 && losize <= m_threshold)
  80. return TRUE;
  81. }
  82. SYSTEMTIME systm;
  83. ::GetLocalTime(&systm);
  84. char szDate[_MAX_PATH];
  85. sprintf(szDate, "%04d_%02d_%02d", systm.wYear, systm.wMonth, systm.wDay, CH_SEPARATOR);
  86. std::string path;
  87. if (!OpenUniDirectory(m_strRoot + szDate, &path))
  88. return FALSE;
  89. char szTime[_MAX_PATH];
  90. sprintf(szTime, "\%02d_%02d_%02d_%03d", systm.wHour, systm.wMinute, systm.wSecond, systm.wMilliseconds);
  91. std::string file;
  92. HANDLE hFile = CreateUniFile(path + szTime, &file);
  93. if (hFile == INVALID_HANDLE_VALUE)
  94. return FALSE;
  95. if (m_hFile != INVALID_HANDLE_VALUE)
  96. ::CloseHandle(m_hFile);
  97. m_hFile = hFile;
  98. return TRUE;
  99. }
  100. ULONG CLogFile::BeginBatch()
  101. {
  102. if (m_threshold == 0)
  103. return 0;
  104. if (m_lBatch == -1)
  105. return 0;
  106. if (!PrepareFile())
  107. return 0;
  108. return ++m_lBatch;
  109. }
  110. ULONG CLogFile::EndBatch()
  111. {
  112. if (m_threshold == 0)
  113. return -1;
  114. if (m_lBatch == 0)
  115. return -1;
  116. return --m_lBatch;
  117. }
  118. BOOL CLogFile::IsBatched()
  119. {
  120. if (m_threshold == 0)
  121. return FALSE;
  122. return m_lBatch;
  123. }
  124. BOOL CLogFile::OpenUniDirectory(const std::string& dirname, std::string* pNewdir)
  125. {
  126. assert(!dirname.empty() && *dirname.rbegin() != CH_SEPARATOR);
  127. std::string path = dirname + dirsuffix_log;
  128. DWORD attr = ::GetFileAttributes(path.c_str());
  129. if (attr != -1)
  130. {
  131. if (attr & FILE_ATTRIBUTE_DIRECTORY)
  132. goto on_skipcreate;
  133. for (DWORD c = 0; ; c++)
  134. {
  135. char buff[9];
  136. sprintf(buff, "%08X", c);
  137. std::string exp = dirname;
  138. exp += CH_EXTSPLIT;
  139. exp += buff;
  140. exp += dirsuffix_log;
  141. DWORD attr2 = ::GetFileAttributes(exp.c_str());
  142. if (attr2 == -1)
  143. {
  144. path = exp;
  145. break;
  146. }
  147. else
  148. {
  149. if (attr2 & FILE_ATTRIBUTE_DIRECTORY)
  150. {
  151. path = exp;
  152. goto on_skipcreate;
  153. }
  154. }
  155. if (c == -1)
  156. return FALSE;
  157. }
  158. }
  159. if (!::CreateDirectory(path.c_str(), NULL))
  160. return FALSE;
  161. on_skipcreate:
  162. if (pNewdir != NULL)
  163. *pNewdir = path;
  164. return TRUE;
  165. }
  166. HANDLE CLogFile::CreateUniFile(const std::string& filename, std::string* pNewfile)
  167. {
  168. assert(!filename.empty() && *filename.rbegin() != CH_SEPARATOR);
  169. std::string file = filename + filesuffix_log;
  170. if (::GetFileAttributes(file.c_str()) != -1)
  171. {
  172. for (DWORD c = 0; ; c++)
  173. {
  174. char buff[9];
  175. sprintf(buff, "%08X", c);
  176. std::string exf = filename;
  177. exf += CH_EXTSPLIT;
  178. exf += buff;
  179. exf += filesuffix_log;
  180. if (::GetFileAttributes(exf.c_str()) == -1)
  181. {
  182. file = exf;
  183. break;
  184. }
  185. if (c == -1)
  186. return FALSE;
  187. }
  188. }
  189. HANDLE hFile = ::CreateFile(file.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
  190. if (hFile == INVALID_HANDLE_VALUE)
  191. return FALSE;
  192. if (pNewfile != NULL)
  193. *pNewfile = file;
  194. return hFile;
  195. }