关闭

MFC CStdioFlie类静态对象对文件的读写操作问题

353人阅读 评论(0) 收藏 举报
分类:

//头文件

#pragma once
#include "afx.h"

class CLogProcedure
{
 public:
  CLogProcedure(void);
  ~CLogProcedure(void);
  static voidCreateLogFile();//负责创建log文件
  static void WriteLogFile( DWORDdwErrorLevel, LPCTSTR lpOutputString, LPCTSTR lpfunc, INT iline);//负责写log文件
  
  enum E_LOG_OUTPUT_LEVEL
  {
   E_LOGLEVEL_FAILED= -1 ,
   E_LOGLEVEL_INFORMATION= 0 ,
   E_LOGLEVEL_SUCCEEDED= 1
  };

 private:
   staticCStdioFile m_plogFile;//最容易出现问题的地方,因为是静态的变量,那么需要注意的是进行初始化

};

 

//CPP

#include "StdAfx.h"
#include <locale.h>
#include "LogProcedure.h"

CStdioFileCLogProcedure::m_plogFile;//很重要的初始化语句因为静态的变量在类中只能被声明,而在类外进行定义(也就是初始化)

CLogProcedure::CLogProcedure(void)
{
 //CreateLogFile();//创建日志文件
}

CLogProcedure::~CLogProcedure(void)
{

}
 
void CLogProcedure::CreateLogFile()
{
 #define MAX_PATH_SIZE (0x100)
 static BOOL logFileState =false;//静态变量只会被初始化一次

 if( false == logFileState )
 {
  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('.')));//返回值是整体到点结束的字符串,因为可执行文件带有扩展名.exe,所以截取可执行文件的名称
   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 ) )//用这样的模式进程创建或者检查文件名称的路径
  {
   logFileState=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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:975657次
    • 积分:17602
    • 等级:
    • 排名:第541名
    • 原创:741篇
    • 转载:522篇
    • 译文:0篇
    • 评论:105条
    最新评论