0
点赞
收藏
分享

微信扫一扫

MFC 日志类

一天清晨 2022-03-31 阅读 292
mfcc++

只有在程序出问题以后才会知道打一个好的日志有多么重。该日志类是程序exe目录下,以年月日时命名的txt 存储。

//log.h 如下:

class Log
{
public:
    static Log* instance;
    static Log* GetInstance();
    Log();
    ~Log();
    bool WriteLog(CString strFilePath, CString str);
    bool WriteLog(CString str);
    CString GetModulePathString();
    CString CharToHex(unsigned char *pBuf, int len);

    bool ReadLog(CString strFileName, CString& retLog);
    char* ReadLog(CString strFileName, int& nFileLen);
};

//log.cpp 如下:

#include "stdafx.h"
#include "Log.h"
#include <string>
using namespace std;
Log* Log::instance = NULL;

Log::Log()
{
}

Log* Log::GetInstance(){
    if (instance == NULL){
        instance = new Log();
    }
    return instance;
}

Log::~Log()
{
}

CString Log::GetModulePathString()
{
    CString    sPath;
    GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
    sPath.ReleaseBuffer();
    int    nPos;
    nPos = sPath.ReverseFind('\\');
    sPath = sPath.Left(nPos + 1);
    return    sPath;
}

bool Log::WriteLog(CString strFilePath, CString str)
{
    CString strWorkPath;
    CString strWorkPathlog;
    CString strTime;

    strWorkPathlog = strFilePath;

    CStdioFile   file;

    if (file.Open(strWorkPathlog, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite) == 0)
        return   false;
    file.SeekToEnd(); //写追加在以前写的后面
    CTime   time = CTime::GetCurrentTime();
    strTime = _T("[%m/%d   %H:%M:%S] ");
    strTime = time.Format(strTime);
    str = strTime + str + _T("\r\n");
    
    char cArray[1024];
    int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
    len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), cArray, len + 1, NULL, NULL);
    cArray[len] = '\0';
    file.Write(cArray,len);
    file.Flush();
    file.Close();
    return   true;
}

bool Log::WriteLog(CString str)
{
    CString strPath = _T("");
    CString strFileName = _T("");
    CTime   time = CTime::GetCurrentTime();
    strPath = GetModulePathString() + _T("Log\\");

    if (!PathFileExists(strPath))
    {
        BOOL rst = CreateMultipleDirectory(strPath);
        if (!rst)
        {
            AfxMessageBox(_T("创建目录失败"));
            return false;
        }
    }
    strFileName = _T("%Y%m%d%H");
    strFileName = time.Format(strFileName) + _T(".txt");
    strPath += strFileName;
    WriteLog(strPath, str);
    return  true;
}

CString Log::CharToHex(unsigned char *pBuf, int len)
{
    CString str = _T("");
    CString retStr = _T("");

    if (pBuf == NULL)
    {
        return retStr;
    }

    for (int i = 0; i < len; i++)
    {
        str.Format(_T("%02X "), pBuf[i]);
        retStr += str;
    }
    return retStr;
}

bool Log::ReadLog(CString strFileName, CString& retLog)
{
    bool bRet = false;
    retLog = _T("");
    CString strPath = _T("");
    strPath = GetModulePathString() + _T("Log\\") + strFileName;

    if (!PathFileExists(strPath))
        return false;

    CStdioFile   file;
    if (file.Open(strPath, CFile::modeNoTruncate | CFile::modeRead) == 0)
        return false;

    CString strLine = _T("");
    retLog = _T("");
    int nHour = 0;
    int nMinute = 0;
    int nSecond = 0;

    file.SeekToBegin();

    while (file.ReadString(strLine))
    {
        int nStart = strLine.Find(_T("[")) + 1;
        int nEnd = strLine.Find(_T("]")) - 1;
        CString strTmp = strLine.Mid(nStart, nEnd - nStart + 1);
        int strHourPos = strTmp.Find(_T(":"));
        nHour = _ttoi(strTmp.Mid(strHourPos - 2, 2));
        nMinute = _ttoi(strTmp.Mid(strHourPos + 1, 2));
        int nSecondPos = strTmp.Find(_T(":"), strHourPos + 1);
        nSecond = _ttoi(strTmp.Mid(nSecondPos + 1, 2));
        retLog += strLine;
    }
    file.Close();

    return true;
}

char* Log::ReadLog(CString strFileName, int& nFileLen)
{
    bool bRet = false;
    CString strPath = _T("");
    strPath = GetModulePathString() + _T("Log\\") + strFileName;
    string strpath = Cstring2Char(strPath);
    return ReadWholeFileAndLen(strpath.c_str(), nFileLen);
}

举报

相关推荐

0 条评论