MFC 在一个项目中添加log文件的读写操作问题
2013-12-02 14:36
531 查看
整体使用类进行封装文件读写的操作
//头文件
#pragma once
#include "afx.h"
class CLogProcedure
{
public:
CLogProcedure(void);
~CLogProcedure(void);
static voidCreateLogFile();//文件的创建与打开操作值得注意的是要进行的文件打开操作,只能打开一次,那就要求设置静态的变量去标识文件的状态
static void WriteLogFile( DWORDdwErrorLevel, LPCTSTR lpOutputString, LPCTSTR lpfunc, INT iline);//对文件进行的写操作,在程序中需要注意的是CStdioFile类的静态设置
enum E_LOG_OUTPUT_LEVEL
{
E_LOGLEVEL_FAILED= -1 ,
E_LOGLEVEL_INFORMATION= 0 ,
E_LOGLEVEL_SUCCEEDED= 1
};
private:
static CStdioFilem_plogFile;
};
//CPP
#include "StdAfx.h"
#include
#include "LogProcedure.h"
CStdioFile CLogProcedure::m_plogFile;//
CLogProcedure::CLogProcedure(void)
{
//CreateLogFile();//创建日志文件
}
CLogProcedure::~CLogProcedure(void)
{
}
void CLogProcedure::CreateLogFile()
{
#define MAX_PATH_SIZE (0x100)
static BOOL bInited = false;//静态变量只会被初始化一次
if( false == bInited )
{
TCHARtcPath[MAX_PATH_SIZE];
GetModuleFileName(NULL, tcPath,MAX_PATH_SIZE);//检索当前进程所执行的可执行文件的路径,就是获得当前可执行文件的路径
CStringfilename(tcPath);
CString strLogName(tcPath);
CString strLogDir;
INT index =filename.ReverseFind(_T('\\'));//返回的是该字符串所在的位置索引
if( -1 != index )
{
INT len =filename.GetLength();
++index;
filename.Delete(index,len - index);//这样就找到了可执行文件的名字了
strLogDir =filename;
strLogDir +=_T("Log\\");
CreateDirectory(strLogDir,NULL);//成功的话返回值非零
CStringstrTemp;
strLogName.Delete(0,index);
strTemp =strLogName.Mid(0,strLogName.ReverseFind(_T('.')));//返回值是整体到点结束的字符串
time_tnowTime;
time(&nowTime);//添加此时的秒数
strLogName.Format(_T("Log\\RUN_%s_%d_LOG.txt"),strTemp, nowTime);//定义文件log的名称是。。。
}
filename +=strLogName;//文件名称的路径
if( m_plogFile.Open( filename,CFile::modeCreate |\
CFile::modeNoTruncate|\
CFile::shareDenyWrite|\
CFile::modeWrite) )//用这样的模式进程创建或者检查文件名称的路径
{
bInited =true;//然后给标志一个新的标志,对此标志进行判断的时候就可以防止(在多次进行写入该次程序运行的时候多个地方的log信息)多次打开文件log文件
}
}
}
void CLogProcedure::WriteLogFile( DWORD dwErrorLevel, LPCTSTRlpOutputString, LPCTSTR lpfunc, INT iline )
{
CreateLogFile();//创建日志文件
char* org = _strdup( setlocale(LC_CTYPE,NULL));//为setlocale(LC_CTYPE,NULL)分配空间副本
setlocale( LC_CTYPE,"chs" );//支持简体中文
CString strErrorLevelInfo;
switch(dwErrorLevel)
{
case E_LOGLEVEL_FAILED:
strErrorLevelInfo =_T("FAILED");
break;
case E_LOGLEVEL_SUCCEEDED:
strErrorLevelInfo =_T("SUCCEEDED");
break;
case E_LOGLEVEL_INFORMATION:
strErrorLevelInfo =_T("INFOMATION");
break;
default:
strErrorLevelInfo =_T("OTHER");
break;
}
CString outputLog;
outputLog.Format(_T("The [%s]: at [%d] line--> %s + %s\r\n"), //文件内容的格式
lpfunc,
iline,
strErrorLevelInfo,
lpOutputString);
m_plogFile.WriteString(outputLog);
m_plogFile.Flush();//强制缓冲区的内容写入指定文件
setlocale( LC_CTYPE, org );
free( org );
return;
}
//头文件
#pragma once
#include "afx.h"
class CLogProcedure
{
public:
CLogProcedure(void);
~CLogProcedure(void);
static voidCreateLogFile();//文件的创建与打开操作值得注意的是要进行的文件打开操作,只能打开一次,那就要求设置静态的变量去标识文件的状态
static void WriteLogFile( DWORDdwErrorLevel, LPCTSTR lpOutputString, LPCTSTR lpfunc, INT iline);//对文件进行的写操作,在程序中需要注意的是CStdioFile类的静态设置
enum E_LOG_OUTPUT_LEVEL
{
E_LOGLEVEL_FAILED= -1 ,
E_LOGLEVEL_INFORMATION= 0 ,
E_LOGLEVEL_SUCCEEDED= 1
};
private:
static CStdioFilem_plogFile;
};
//CPP
#include "StdAfx.h"
#include
#include "LogProcedure.h"
CStdioFile CLogProcedure::m_plogFile;//
CLogProcedure::CLogProcedure(void)
{
//CreateLogFile();//创建日志文件
}
CLogProcedure::~CLogProcedure(void)
{
}
void CLogProcedure::CreateLogFile()
{
#define MAX_PATH_SIZE (0x100)
static BOOL bInited = false;//静态变量只会被初始化一次
if( false == bInited )
{
TCHARtcPath[MAX_PATH_SIZE];
GetModuleFileName(NULL, tcPath,MAX_PATH_SIZE);//检索当前进程所执行的可执行文件的路径,就是获得当前可执行文件的路径
CStringfilename(tcPath);
CString strLogName(tcPath);
CString strLogDir;
INT index =filename.ReverseFind(_T('\\'));//返回的是该字符串所在的位置索引
if( -1 != index )
{
INT len =filename.GetLength();
++index;
filename.Delete(index,len - index);//这样就找到了可执行文件的名字了
strLogDir =filename;
strLogDir +=_T("Log\\");
CreateDirectory(strLogDir,NULL);//成功的话返回值非零
CStringstrTemp;
strLogName.Delete(0,index);
strTemp =strLogName.Mid(0,strLogName.ReverseFind(_T('.')));//返回值是整体到点结束的字符串
time_tnowTime;
time(&nowTime);//添加此时的秒数
strLogName.Format(_T("Log\\RUN_%s_%d_LOG.txt"),strTemp, nowTime);//定义文件log的名称是。。。
}
filename +=strLogName;//文件名称的路径
if( m_plogFile.Open( filename,CFile::modeCreate |\
CFile::modeNoTruncate|\
CFile::shareDenyWrite|\
CFile::modeWrite) )//用这样的模式进程创建或者检查文件名称的路径
{
bInited =true;//然后给标志一个新的标志,对此标志进行判断的时候就可以防止(在多次进行写入该次程序运行的时候多个地方的log信息)多次打开文件log文件
}
}
}
void CLogProcedure::WriteLogFile( DWORD dwErrorLevel, LPCTSTRlpOutputString, LPCTSTR lpfunc, INT iline )
{
CreateLogFile();//创建日志文件
char* org = _strdup( setlocale(LC_CTYPE,NULL));//为setlocale(LC_CTYPE,NULL)分配空间副本
setlocale( LC_CTYPE,"chs" );//支持简体中文
CString strErrorLevelInfo;
switch(dwErrorLevel)
{
case E_LOGLEVEL_FAILED:
strErrorLevelInfo =_T("FAILED");
break;
case E_LOGLEVEL_SUCCEEDED:
strErrorLevelInfo =_T("SUCCEEDED");
break;
case E_LOGLEVEL_INFORMATION:
strErrorLevelInfo =_T("INFOMATION");
break;
default:
strErrorLevelInfo =_T("OTHER");
break;
}
CString outputLog;
outputLog.Format(_T("The [%s]: at [%d] line--> %s + %s\r\n"), //文件内容的格式
lpfunc,
iline,
strErrorLevelInfo,
lpOutputString);
m_plogFile.WriteString(outputLog);
m_plogFile.Flush();//强制缓冲区的内容写入指定文件
setlocale( LC_CTYPE, org );
free( org );
return;
}
相关文章推荐
- 利用Myeclipse为现有项目添加maven支持,傻瓜式操作即可轻松解决jar包依赖问题
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
- VS2008中解决方案只能添加一个项目的问题解决
- 同一个tomcat添加多个项目的报webAppRootKey错问题
- 我在用dotnet做一个项目的过程中,遇到了一个ListBox的问题:通过在一个ListBox中双击,把选中的项添加到另一个ListBox中
- MFC CStdioFlie类静态对象对文件的读写操作问题
- FMDB多线程读写问题,使用FMDataBaseQueue操作可以解决同时打开一个链接de读写问题
- vs2013中如何给一个项目添加MFC支持
- MFC一个工程添加多个项目
- 引用一个项目作为library的操作步骤---开发中遇到的问题(二)
- 引用一个项目作为library的操作步骤---开发中遇到的问题(二)
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
- 在已经做好的MFC项目中添加一个登陆界面
- 个人解决的一个IDEA项目中不能引用pom文件中添加的依赖问题
- 完美解决Android在listview添加checkbox实现批量操作问题
- 一个操作共享内存的类!可以方面的添加,删除数据,包括各种结构体!
- 创建一个weex项目出现proxy的问题
- react 项目的一个ie8兼容性问题
- 添加文件【COCOS2DX-LUA 脚本开发之十三】解决lua项目编译Android出现get data from file failed、Cocos2dxActivity cannot be 路径等问题
- 最近被一个问题困扰着,如何实现类似Photoshop的多层图像操作,每层可单独操作,又可以组合显示出来。