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 + -
显示快捷键?