用于少量日志的保存情形,以当前日期为文件名保存。
- 每个文件第一次创建时通过二进制方式写入标识头“0xFFFE”来标识Unicode文件,否则会无法显示中文。
- 添加临界区防止多线程访问冲突。
CLog.h
#pragma once
class CLog
{
public:
CLog();
~CLog();
private:
CRITICAL_SECTION m_hCS;
public:
void Log(CString strLog);
};
CLog.cpp
#include "stdafx.h"
#include "Log.h"
CLog::CLog()
{
InitializeCriticalSection(&m_hCS);
}
CLog::~CLog()
{
DeleteCriticalSection(&m_hCS);
}
void CLog::Log(CString strLog)
{
EnterCriticalSection(&m_hCS);
CString strFileName = CTime::GetCurrentTime().Format("%Y-%m-%d") + L".log";
CString strFileDir;
GetModuleFileName(NULL, strFileDir.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
strFileDir.ReleaseBuffer();
int s32PosIndex = strFileDir.ReverseFind('\\');
strFileDir = strFileDir.Left(s32PosIndex) + L"\\Log";
if (!PathIsDirectory(strFileDir))
{
SHCreateDirectoryEx(NULL, strFileDir, nullptr);
}
CString strFilePath = strFileDir + L"\\" + strFileName;
BOOL bIsFileExist = PathFileExists(strFilePath);
CStdioFile cFile(strFilePath, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::shareDenyWrite | CFile::typeBinary);
CString strLogLine = CTime::GetCurrentTime().Format(L"[%H:%M:%S] ") + strLog + L"\r\n";
if (!bIsFileExist)
{
cFile.SeekToEnd();
WORD u16UnicodeFlag = 0xFEFF; // 文件采用Unicode格式
cFile.Write((void*)&u16UnicodeFlag, sizeof(WORD));
}
cFile.SeekToEnd();
cFile.WriteString(strLogLine);
cFile.Close();
LeaveCriticalSection(&m_hCS);
}