zoukankan      html  css  js  c++  java
  • C++ WIN32 日志程序

    头文件

    ***

     1 #pragma once
     2 #pragma once
     3 #include "stdio.h"
     4 #include "windows.h"
     5 #include "tchar.h"
     6 #include "shlwapi.h"
     7 #pragma comment(lib,"shlwapi.lib")
     8 class Log
     9 {
    10 public:
    11     static bool Write(TCHAR* logStr, TCHAR* logType = _T("log"), TCHAR* logDir = _T("log"));
    12     //参数如何区分目录和文件:
    13     //如果最后有\肯定是目录
    14     //如果最后又后缀".",则肯定是文件
    15     //如果最后没有\,也没有后缀'.",则认为是路径
    16     static bool CreateFolder(TCHAR* pszPath);
    17 private:
    18     Log();
    19     ~Log();
    20     static Log* InitInstance();
    21     //当前路径
    22     static TCHAR s_curPath[MAX_PATH];
    23     //日志目录
    24     static TCHAR s_logDir[MAX_PATH];
    25     //日志的全目录路径
    26     static TCHAR s_logPath[MAX_PATH];
    27     static Log* s_instance;
    28 };

    源文件

    **

    #include "Log.h"
    Log* Log::s_instance = NULL;
    TCHAR Log::s_curPath[MAX_PATH];
    TCHAR Log::s_logPath[MAX_PATH];
    TCHAR Log::s_logDir[MAX_PATH];
    Log* Log::InitInstance()
    {
        if (s_instance == NULL)
        {
            s_instance = new Log();
        }
        return s_instance;
    }
    //日志写入硬盘的程序,合计三个参数
    //参数1:
    //参数2:
    //参数3:
    bool Log::Write(TCHAR* logStr, TCHAR* logType, TCHAR* logDir)
    {
        _tcscpy_s(s_logDir, logDir);
        InitInstance();
        SYSTEMTIME time;
        GetLocalTime(&time);
        TCHAR date[128] = { 0 }, filename[128] = { 0 }, hh[50] = _T("
    ");
        swprintf_s(date, _T("%d-%02d-%02d %02d:%02d:%02d"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
        swprintf_s(filename, _T("%s\%s_%d-%02d-%02d.log"), s_logPath, logType, time.wYear, time.wMonth, time.wDay);
        FILE* fp;
        _tfopen_s(&fp, filename, _T("a,ccs=UTF-8"));
        TCHAR newstr[1024] = { 0 };
        swprintf_s(newstr, _T("%s : %s
    "), date, logStr);
        if (fp) {
            fwrite(newstr, sizeof(TCHAR), _tcslen(newstr), fp);
            fclose(fp);
            return true;
        }
        else {
            return false;
        }
    }
    bool Log::CreateFolder(TCHAR* pszPath)
    {
        //如果后面有\则是路径,如果没有,但有后缀,则是文件,无后缀则也是路径
        TCHAR szPath[_MAX_PATH] = { 0 };
        swprintf_s(szPath, pszPath, _MAX_PATH);
        szPath[_MAX_PATH - 1] = 0;
        TCHAR* pdot = _tcsrchr(szPath, _T('.'));
        TCHAR* psp = _tcsrchr(szPath, _T('\'));
        if (psp && pdot && pdot > psp)
        {
            //在路径最后找到上面两个字符证明是文件,去掉文件名
            psp[0] = 0;
        }
        else
        {
            //缺省是个目录,这个地方可能吧没有后缀的文件当作目录,这里不做处理,默认当成目录
        }
        PathAddBackslash(szPath);
        if (PathIsDirectory(szPath))
            return true;
        psp = _tcschr(szPath, _T('\'));
        while (psp)
        {
            *psp = 0;
            if (!PathIsDirectory(szPath))
            {
                if (!CreateDirectory(szPath, 0))
                    return false;
            }
            *psp = _T('\');
            psp = _tcschr(psp + 1, _T('\'));
        }
        return true;
    };
    Log::Log()//构造函数
    {
        //取当前执行模块的全路径,如果此模块是被其它程序调用的,返回的路径还是这个程序的路径
        ::GetModuleFileName(NULL, s_curPath, MAX_PATH);
        //从路径中移除文件名
        PathRemoveFileSpec(s_curPath);
        swprintf_s(s_logPath, _T("%s\%s"), s_curPath, s_logDir);
        if (!CreateFolder(s_logPath))
        {
            MessageBox(NULL, _T("日志目录创建失败"), NULL, 0);
        }
    }
    Log::~Log()//析构函数
    {
    }
  • 相关阅读:
    STL 源代码剖析 算法 stl_numeric.h -- copy
    SQLServer 复制和数据库镜像 具体配置部署
    2016第23周三
    2016第23周二
    2016第23周一
    2016第22周日
    2016第22周六
    2016第22周五
    五个JS经典面试题
    2016第22周三
  • 原文地址:https://www.cnblogs.com/wenluderen/p/15163349.html
Copyright © 2011-2022 走看看