threadlogfileinfo.cpp
来自「深入浅出Visual C++入门进阶与应用实例 随书光盘 作者 何志丹」· C++ 代码 · 共 130 行
CPP
130 行
// ThreadLogFileInfo.cpp: implementation of the CThreadLogFileInfo class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ThreadLogFileInfo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//CThreadLogFileInfo类
CThreadLogFileInfo::CThreadLogFileInfo(DWORD dThreadID)
{
m_nThreadID = dThreadID ;
m_nObjectCount = 0 ;
m_hFileHandle = NULL ;
}
HANDLE CThreadLogFileInfo::CreateLogFile(CString strPathName)
{
CString strFileName ;
strFileName.Format("%s%d.txt",strPathName,m_nThreadID);
m_hFileHandle = ::CreateFile(strFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
NULL,CREATE_ALWAYS,0,0);
return m_hFileHandle ;
}
//CThreadLogFiles类
CThreadLogFiles::~CThreadLogFiles()
{
for(POSITION pos = m_ThredLogs.GetStartPosition() ; NULL != pos ; )
{
CThreadLogFileInfo * pInfo ;
DWORD dID ;
m_ThredLogs.GetNextAssoc(pos,dID,pInfo);
if(NULL != pInfo)
delete pInfo ;
}
}
HANDLE CThreadLogFiles::GetLogFileHandle(DWORD dThreadID)
{
CThreadLogFileInfo * pInfo = m_ThredLogs[dThreadID] ;
ASSERT(NULL != pInfo) ;
return pInfo->m_hFileHandle ;
}
void CThreadLogFiles::BeginAObject(DWORD dThreadID)
{
CThreadLogFileInfo * pInfo = m_ThredLogs[dThreadID] ;
if( NULL == pInfo )
{
pInfo = new CThreadLogFileInfo(dThreadID);
if(NULL == pInfo )
return ;//分配内存失败
if(NULL == pInfo->CreateLogFile(m_strPathName))
return ;//建立日志文件失败
m_ThredLogs[dThreadID] = pInfo ;
}
pInfo->m_nObjectCount ++ ;
}
void CThreadLogFiles::EndAObject(DWORD dThreadID)
{
CThreadLogFileInfo * pInfo = m_ThredLogs[dThreadID] ;
ASSERT(NULL != pInfo) ;
pInfo->m_nObjectCount-- ;
}
CString CThreadLogFiles::GetPreString(DWORD dThreadID)
{//在前面加若干个空格,这样会有层次感,每层多一个空格
CThreadLogFileInfo * pInfo = m_ThredLogs[dThreadID] ;
ASSERT(NULL != pInfo) ;
char * pszPre = new char[pInfo->m_nObjectCount] ;
memset(pszPre,' ',pInfo->m_nObjectCount);
pszPre[pInfo->m_nObjectCount - 1 ] = '\0' ;
CString strPre = pszPre ;
delete [] pszPre ;
return strPre ;
}
bool CThreadLogFiles::InitLog()
{
//取得EXE所在目录
CString strPathName;
GetModuleFileName(NULL,strPathName.GetBuffer(256),256);
strPathName.ReleaseBuffer(256);
int nPos = strPathName.ReverseFind('\\');
strPathName = strPathName.Left(nPos + 1);
m_strPathName = strPathName + "LogFile\\";
CFileFind fileFind;
if(0 != fileFind.FindFile(m_strPathName))
{
fileFind.FindNextFile();
if(!fileFind.IsDirectory())
return false ;//存在同名的文件,无法创建文件夹
return true ;//文件夹已经存在
}
if(!CreateDirectory(m_strPathName,NULL))
return false ;//建立文件夹失败
return true ;
}
bool CThreadLogFiles::ExitLog()
{//关闭所有文件文件句柄
for(POSITION pos = m_ThredLogs.GetStartPosition() ; NULL != pos ; )
{
CThreadLogFileInfo * pInfo ;
DWORD dID ;
m_ThredLogs.GetNextAssoc(pos,dID,pInfo);
if(NULL == pInfo)
continue ;
CloseHandle(pInfo->m_hFileHandle);
}
return true ;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?