⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logfile.cpp

📁 在WINCE 5.0 上基于Maxim 17040 电池采样测试程序
💻 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 + -