📄 logfile.cpp
字号:
#include "LogFile.h"
CLogFile::CLogFile(BOOL bNewAllways) //是否总是创建新log
{
#if defined(UNICODE) || defined(_UNICODE)
m_bUniCode = TRUE;
#else
m_bUniCode = FALSE;
#endif
m_szFileName = NULL;
m_hFile = INVALID_HANDLE_VALUE;
::InitializeCriticalSection(&m_csLock);
m_bNewAlways = bNewAllways;
}
CLogFile::CLogFile(LPCTSTR szFileName, BOOL bNewAllways) //设定日志文件名, 是否总是创建新log
{
#if defined(UNICODE) || defined(_UNICODE)
m_bUniCode = TRUE;
#else
m_bUniCode = FALSE;
#endif
m_szFileName = NULL;
m_hFile = INVALID_HANDLE_VALUE;
::InitializeCriticalSection(&m_csLock);
m_bNewAlways = bNewAllways;
SetFileName(szFileName);
}
CLogFile::~CLogFile()
{
::DeleteCriticalSection(&m_csLock);
Close();
if(m_szFileName)
delete [] m_szFileName;
}
void CLogFile::SetFileName(LPCTSTR szName)//修改文件名, 同时关闭上一个日志文件
{
ASSERT(szName);
if(m_szFileName)
delete [] m_szFileName;
Close();
m_szFileName = new TCHAR[_tcslen(szName) + 1];
if(m_szFileName)
_tcscpy(m_szFileName, szName);
OpenFile();
}
void CLogFile::Close()
{
if(IsOpen())
{
CloseHandle(m_hFile);
m_hFile = INVALID_HANDLE_VALUE;
}
}
void CLogFile::LogBuffer(LPCVOID lpBuffer, DWORD dwLength, BOOL bTimeStamp)//追加日志内容
{
ASSERT(lpBuffer);
Lock();
if(!OpenFile())
{
Unlock();
return;
}
WriteLog(lpBuffer, dwLength, bTimeStamp);
Unlock();
}
BOOL CLogFile:: OpenFile()//打开文件, 指针到文件尾
{
if(IsOpen())
return TRUE;
if(!m_szFileName)
return FALSE;
if(m_bNewAlways)
{
m_hFile = CreateFile(m_szFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#if defined(UNICODE) || defined(_UNICODE)
BYTE buf[2] = {0xFF, 0xFE};
DWORD dwWriteLength;
m_bUniCode = TRUE;
WriteFile(m_hFile, buf, 2, &dwWriteLength, NULL);
#else
m_bUniCode = FALSE;
#endif
}
else
{
m_hFile = CreateFile(m_szFileName, GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
//打开不成功, 且因为文件不存在, 创建文件
if(!IsOpen() && GetLastError() == 2)
{
m_hFile = CreateFile(m_szFileName, GENERIC_WRITE, 0,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#if defined(UNICODE) || defined(_UNICODE)
BYTE buf[2] = {0xFF, 0xFE};
DWORD dwWriteLength;
m_bUniCode = TRUE;
WriteFile(m_hFile, buf, 2, &dwWriteLength, NULL);
#else
m_bUniCode = FALSE;
#endif
}
else if(IsOpen())
{
BYTE buf[2] = {0};
ReadFile(m_hFile, buf, 2, NULL, NULL);
m_bUniCode = (buf[0] == 0xFF) && (buf[1] == 0xFE);
}
}
if(IsOpen())
SetFilePointer(m_hFile, 0, NULL, FILE_END);
return IsOpen();
}
void CLogFile::Log(LPCTSTR szText, BOOL bTimeStamp)
{
#if defined(UNICODE) || defined(_UNICODE)
LogW(szText, bTimeStamp);
#else
LogA(szText, bTimeStamp);
#endif
}
void CLogFile::LogW(LPCWSTR szText, BOOL bTimeStamp)
{
if(m_bUniCode)
LogBuffer((void*)szText, wcslen(szText)*sizeof(WCHAR), bTimeStamp);
else
{
int iLen = 0;
char *pBuffer = NULL;
iLen = wcslen(szText);
pBuffer = new CHAR[iLen + 1];
if(!pBuffer)
return;
WideCharToMultiByte(CP_ACP, 0, szText, iLen, pBuffer, iLen+1, NULL, NULL);
iLen = strlen(pBuffer);
LogBuffer(pBuffer, iLen*sizeof(CHAR), bTimeStamp);
delete [] pBuffer;
pBuffer = NULL;
}
}
void CLogFile::LogA(LPCSTR szText, BOOL bTimeStamp)
{
if(!m_bUniCode)
LogBuffer((void*)szText, strlen(szText)*sizeof(CHAR), bTimeStamp);
else
{
int iLen = 0;
WCHAR *pBuffer = NULL;
iLen = strlen(szText);
pBuffer = new WCHAR[iLen + 1];
if(!pBuffer)
return;
MultiByteToWideChar(CP_ACP, 0, szText, iLen, pBuffer, (iLen+1)*sizeof(WCHAR));
iLen = wcslen(pBuffer);
LogBuffer(pBuffer, iLen*sizeof(WCHAR), bTimeStamp);
delete [] pBuffer;
pBuffer = NULL;
}
}
void CLogFile::WriteNewLine()
{
const BYTE cs_UnicodeNewLine[4] = {0x0d, 0x00, 0x0a, 0x00};
const BYTE cs_AnsiNewLine[2] = {0x0d, 0x0a};
DWORD dwWriteLength = 0;
if(m_bUniCode)
WriteFile(m_hFile, cs_UnicodeNewLine, sizeof(cs_UnicodeNewLine), &dwWriteLength, NULL);
else
WriteFile(m_hFile, cs_AnsiNewLine, sizeof(cs_AnsiNewLine), &dwWriteLength, NULL);
}
void CLogFile::WriteTime()
{
WCHAR szUnicodeTime[200] = {0};
CHAR szAnsiTime[200] = {0};
DWORD dwWriteLength;
SYSTEMTIME now;
::GetLocalTime(&now);
if(m_bUniCode)
{
swprintf(szUnicodeTime, L"%04d-%02d-%02d %02d:%02d:%02d--------", now.wYear, now.wMonth,
now.wDay, now.wHour, now.wMinute, now.wSecond);
WriteFile(m_hFile, szUnicodeTime, _tcslen(szUnicodeTime)*sizeof(WCHAR), &dwWriteLength, NULL);
}
else
{
sprintf(szAnsiTime, "%04d-%02d-%02d %02d:%02d:%02d--------", now.wYear, now.wMonth,
now.wDay, now.wHour, now.wMinute, now.wSecond);
WriteFile(m_hFile, szAnsiTime, strlen(szAnsiTime)*sizeof(CHAR), &dwWriteLength, NULL);
}
}
void CLogFile::WriteLog( LPCVOID lpBuffer, DWORD dwLength, BOOL bTimeStamp)//写日志, 可以扩展修改
{
DWORD dwWriteLength;
if(IsOpen())
{
SetFilePointer(m_hFile, 0, NULL, FILE_END);
if(bTimeStamp)
WriteTime();
WriteFile(m_hFile, lpBuffer, dwLength, &dwWriteLength, NULL);
WriteNewLine();
FlushFileBuffers(m_hFile);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -