// OperatorLog.cpp: implementation of the COperatorLog class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "OperatorLog.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
vector<STLogData> COperatorLog::s_m_vtData(LAST_LOG_DATA_MAX_SIZE);
COperatorLog::COperatorLog()
{
m_pucData = NULL;
}
COperatorLog::~COperatorLog()
{
Free();
}
void COperatorLog::GenerateErrorInfo(LPCTSTR pctszModuleName, LPTSTR ptszDescribeFormat, ...)
{
va_list vlData;
TCHAR tszDescribe[LOG_DATA_DESCRIBE_MAX_SIZE] = {0};
DWORD dwRet;
LPVOID pvBuffer;
long lOffset;
long lRet;
va_start(vlData, ptszDescribeFormat);
_vsntprintf(tszDescribe, sizeof(tszDescribe), ptszDescribeFormat, vlData);
va_end(vlData);
dwRet = GetLastError();
if (dwRet != 0)
{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwRet,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR)&pvBuffer,
0,
NULL
);
lOffset = -1;
lRet = StringFind((LPCTSTR)pvBuffer, _T("\r\n"), 2, lOffset);
if (lRet == (_tcslen((LPCTSTR)pvBuffer) - 2) * sizeof(TCHAR))
{
memset((UCHAR *)pvBuffer + lRet, NULL, 2 * sizeof(TCHAR));
}
_stprintf(tszDescribe + _tcslen(tszDescribe), _T("(%06d:%s)"), dwRet, (TCHAR *)pvBuffer);
LocalFree(pvBuffer);
}
GenerateLogData(1, pctszModuleName, tszDescribe);
}
void COperatorLog::GenerateLogData(long lLevel, LPCTSTR pctszModuleName, LPTSTR ptszDescribeFormat, ...)
{
STLogData stldData;
va_list vlData;
SYSTEMTIME stData;
TCHAR tszLogData[LOG_DATA_MAX_SIZE] = {0};
vector<TSTRING> vtData;
vector<TSTRING>::const_iterator vtitData;
TCHAR tszFilePath[LOG_DATA_FILE_PATH_MAX_SIZE] = {0};
long lRet;
TCHAR tszFilePathTemp[LOG_DATA_FILE_PATH_MAX_SIZE] = {0};
stldData.lLevel = lLevel;
_tcscpy(stldData.tszModuleName, pctszModuleName);
va_start(vlData, ptszDescribeFormat);
_vsntprintf(stldData.tszDescribe, sizeof(stldData.tszDescribe), ptszDescribeFormat, vlData);
va_end(vlData);
// 只有级别为1 程序错误、2 业务异常的日志数据需要除重
if (stldData.lLevel == 1 ||
stldData.lLevel == 2)
{
for (m_vtitData = s_m_vtData.begin(); m_vtitData != s_m_vtData.end(); ++m_vtitData)
{
if (memcmp(&stldData, &(*m_vtitData), sizeof(STLogData)) == 0)
{
return;
}
}
s_m_vtData.push_back(stldData);
if (s_m_vtData.size() > LAST_LOG_DATA_MAX_VALUE)
{
m_vtitData = s_m_vtData.begin();
s_m_vtData.erase(m_vtitData);
}
}
GetLocalTime(&stData);
_stprintf(tszLogData, _T("<?%02d:%02d:%02d:%03d"), stData.wHour, stData.wMinute, stData.wSecond, stData.wMilliseconds);
_stprintf(tszLogData + _tcslen(tszLogData), _T("<%d"), stldData.lLevel);
_stprintf(tszLogData + _tcslen(tszLogData), _T("<%s"), stldData.tszModuleName);
lRet = StringSplit(stldData.tszDescribe, _T("\r\n"), &vtData, 1, 0);
_tcscpy(tszLogData + _tcslen(tszLogData), _T("<"));
for (vtitData = vtData.begin(); vtitData != vtData.end(); ++vtitData)
{
if (_tcslen((*vtitData).c_str()) > 0)
{
_tcscpy(tszLogData + _tcslen(tszLogData), (*vtitData).c_str());
_tcscpy(tszLogData + _tcslen(tszLogData), _T("="));
}
}
vtData.clear();
_stprintf(tszLogData + _tcslen(tszLogData) - 1, _T("%s"), _T("\r\n"));
lRet = GetPathOfModuleFile(tszFilePath);
_stprintf(tszFilePathTemp,
_T("%s%s%02d-%4d-%02d-%02d%s"),
tszFilePath, _T("log"), lLevel, stData.wYear, stData.wMonth, stData.wDay, _T(".txt"));
lRet = WriteString(tszFilePathTemp, tszLogData, 4, TRUE, 2);
_stprintf(tszFilePathTemp,
_T("%s%s%02d%s"),
tszFilePath, _T("log"), lLevel, _T(".txt"));
lRet = WriteString(tszFilePathTemp, tszLogData, 4, TRUE, 2);
}
void COperatorLog::GetLogData(vector<vector<TSTRING> > *pvtLogData, long lLevel, long lLogDataCount)
{
SYSTEMTIME stData;
long lLogDataCountTemp;
long lLevelTemp;
TCHAR tszFilePath[LOG_DATA_FILE_PATH_MAX_SIZE] = {0};
long lRet;
long lDataSize;
long lOffset;
long lDataSizeTemp;
UCHAR ucLogDataTemp[LOG_DATA_MAX_SIZE] = {0};
UCHAR *pucLogDataTemp;
TCHAR *ptszLogDataTemp;
vector<TSTRING> vtData;
vector<TSTRING>::const_iterator vtitData;
vector<TSTRING> vtData2;
vector<TSTRING> vtData3;
pvtLogData->clear();
GetLocalTime(&stData);
lLogDataCountTemp = 0;
for (lLevelTemp = 1; lLevelTemp <= 3; lLevelTemp++)
{
if (lLevel != -1 && lLevel != lLevelTemp)
{
continue;
}
// 从文件读取数据(ANSI编码)
lRet = GetPathOfModuleFile(tszFilePath);
if (lRet != 0)
{
return;
}
_stprintf(tszFilePath,
_T("%s%s%02d%s"),
tszFilePath, _T("log"), lLevelTemp, _T(".txt"));
lRet = DataSize(tszFilePath, lDataSize, 4);
if (lRet < 0)
{
return;
}
pucLogDataTemp = new UCHAR[lDataSize + 1];
memset(pucLogDataTemp, NULL, lDataSize + 1);
lOffset = 0;
while (TRUE)
{
lDataSizeTemp = LOG_DATA_SINGLE_DATA_SIZE;
lRet = ReadByte(tszFilePath, ucLogDataTemp, lDataSizeTemp, 4, 0, lOffset);
if (lRet < 0 || lDataSizeTemp == 0)
{
break;
}
memcpy(pucLogDataTemp + lOffset, ucLogDataTemp, lDataSizeTemp);
lOffset += lDataSizeTemp;
}
if (lOffset == 0)
{
continue;
}
// 将数据的编码改为Unicode
lDataSize = (long)DataConvert((const UCHAR *)pucLogDataTemp, NULL, DATA_FORMAT2_ANSI, DATA_FORMAT2_T, 0);
ptszLogDataTemp = new TCHAR[lDataSize / sizeof(TCHAR) + 1];
memset(ptszLogDataTemp, NULL, lDataSize + sizeof(TCHAR));
DataConvert((const UCHAR *)pucLogDataTemp, (UCHAR *)ptszLogDataTemp, DATA_FORMAT2_ANSI, DATA_FORMAT2_T, -1);
delete [] pucLogDataTemp;
pucLogDataTemp = NULL;
// 解析数据
lRet = StringSplit((LPCTSTR)ptszLogDataTemp, _T("<?"), &vtData, 2, -1);
if (lRet >= 0)
{
for (vtitData = vtData.begin(); vtitData != vtData.end(); ++vtitData)
{
if (lLogDataCount != -1 && lLogDataCountTemp >= lLogDataCount)
{
break;
}
lRet = StringSplit((*vtitData).c_str(), _T("<"), &vtData2, 1, 0);
if (vtData2.size() == 4)
{
lRet = StringSplit(vtData2.back().c_str(), _T("="), &vtData3, 1, 0);
if (vtData3.size() > 1)
{
vtData2.pop_back();
vtData2.insert(vtData2.end(), vtData3.begin(), vtData3.end());
}
vtData3.clear();
pvtLogData->push_back(vtData2);
lLogDataCountTemp++;
}
vtData2.clear();
}
}
vtData.clear();
delete [] ptszLogDataTemp;
ptszLogDataTemp = NULL;
// 删除缓存日志文件
lRet = DeleteFile(tszFilePath);
}
}
long COperatorLog::GetPathOfFileDialog(LPTSTR ptszFilePath, LPCTSTR pctszFileTypeName, LPCTSTR pctszFileTypeValue)
{
const TCHAR tszModuleName[] = _T("GetPathOfFileDialog");
TCHAR BASED_CODE tszFilter[1024] = {0};
_stprintf(tszFilter, _T("%s|%s|All Files (*.*)|*.*|"), pctszFileTypeName, pctszFileTypeValue);
CFileDialog pCFDSel(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT, tszFilter, NULL);
if (pCFDSel.DoModal() != IDOK)
{
return -1;
}
_tcscpy(ptszFilePath, pCFDSel.GetPathName());
return 0;
}
long COperatorLog::GetPathOfModuleFile(LPTSTR ptszFilePath)
{
const TCHAR tszModuleName[] = _T("GetPathOfModuleFile");
TCHAR tszPathTemp[2];
// 当前文件路径,当第一个参数为NULL时,获取的路径为调用方模块所在路径;否则,获取的路径可以为本模块所在路径
if (GetModuleFileName(NULL, ptszFilePath, 1024) == 0)
{
return -1;
}
for (long lCount = _tcslen(ptszFilePath) - 1; lCount >= 0; lCount--)
{
memset(tszPathTemp, NULL, sizeof(tszPathTemp));
memcpy(tszPathTemp, ptszFilePath + lCount, sizeof(TCHAR));
if (_tcscmp(tszPathTemp, _T("\\")) == 0)
{
memset(ptszFilePath + lCou
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
有以下函数可供使用: 1获取文件路径对话框指定文件路径 2获取文件对话框指定文件路径 3获取当前进程已加载模块所在文件路径 4获取当前工作路径 5浏览指定文件路径 6解析并创建文件路径 7判断文件路径是否合法 8删除多级文件路径 9创建多级文件路径 10复制多级文件路径 源码包含了封装的功能模块类以及测试类, 全部源码都可以用VS2020编译通过,请放心使用! 友情提示,为了兼顾一些旧代码,预编译头文件用的是StdAfx.h,如果需要更换为最新的pch.h,请按照以下步骤操作: 1将StdAfx.h、StdAfx.cpp移出项目,并添加pch.h、pch.cpp 2选中整个项目,项目-属性-C++-预编译头-预编译头文件:pch.h 3选中单个pch.cpp文件,右键菜单,属性-C++-预编译头-预编译头:创建(/Yc) 4确保步骤2、3在所有配置(配置:Release、Debug,平台:Win32、x64,共四种组合)均设置成功 5源码中所有使用StdAfx.h的地方,均改为pch.h
资源推荐
资源详情
资源评论
收起资源包目录
Src04.rar (77个子文件)
Include
OperatorPath.cpp 12KB
OperatorCommon.cpp 471B
OperatorCommon.h 765B
TestOperatorPath.cpp 3KB
OperatorPath.h 2KB
TestOperatorPath.h 722B
OperatorLog.cpp 28KB
OperatorLog.h 6KB
Library
WorkSpace02
Project01
Output
TempU
TempA
OperatorPath
一二三123abc
一二三123abc_2
一二三123abc_2
一二三123abc.gif 14KB
一二三123abc.jpg 22KB
一二三123abc.png 65KB
一二三123abc.bmp 137KB
一二三123abc_3
一二三123abc.gif 14KB
一二三123abc.jpg 22KB
一二三123abc.png 65KB
一二三123abc.bmp 137KB
一二三123abc
一二三123abc.gif 14KB
一二三123abc.jpg 22KB
一二三123abc.png 65KB
一二三123abc.bmp 137KB
一二三123abc
一二三123abc_2
一二三123abc.gif 14KB
一二三123abc.jpg 22KB
一二三123abc.png 65KB
一二三123abc.bmp 137KB
一二三123abc_3
一二三123abc.gif 14KB
一二三123abc.jpg 22KB
一二三123abc.png 65KB
一二三123abc.bmp 137KB
一二三123abc
一二三123abc.gif 14KB
一二三123abc.jpg 22KB
一二三123abc.png 65KB
一二三123abc.bmp 137KB
Include
BuildAll.sln 2KB
DemoU
DemoU.vcxproj 13KB
CViewLog02Dlg.h 679B
framework.h 2KB
DemoU.vcxproj.filters 4KB
DemoUDlg.cpp 6KB
DemoU.rc 12KB
res
DemoU.ico 66KB
DemoU.rc2 666B
Resource.h 773B
DemoUDlg.h 996B
pch.h 546B
CViewLog03Dlg.cpp 7KB
StdAfx.cpp 19B
CViewLog03Dlg.h 679B
DemoU.cpp 3KB
pch.cpp 158B
CViewLog02Dlg.cpp 7KB
CViewLog01Dlg.cpp 7KB
StdAfx.h 141B
DemoU.h 472B
targetver.h 295B
CViewLog01Dlg.h 679B
DemoA
DemoA.rc 12KB
DemoADlg.h 996B
DemoADlg.cpp 6KB
CViewLog02Dlg.h 679B
DemoA.cpp 3KB
DemoA.h 472B
framework.h 2KB
DemoA.vcxproj 13KB
res
DemoA.rc2 666B
DemoA.ico 66KB
Resource.h 773B
pch.h 546B
CViewLog03Dlg.cpp 7KB
StdAfx.cpp 19B
CViewLog03Dlg.h 679B
pch.cpp 158B
DemoA.vcxproj.filters 4KB
CViewLog02Dlg.cpp 7KB
CViewLog01Dlg.cpp 7KB
StdAfx.h 141B
targetver.h 295B
CViewLog01Dlg.h 679B
共 77 条
- 1
资源评论
skyksksksksks
- 粉丝: 273
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SSCMS登录模块需要的JS文件
- JSP网络购物中心毕业设计(源代码+论文).rar
- 白盒测试报告.docx
- 基于LM5117芯片评估开发板硬件参考设计(原理图+PCB)+中英文数据手册资料.zip
- 照片批量重命名软件(文件批量修改图片文件名)
- app.apk
- 人工智能(AI)是计算机科学的一个分支,旨在开发和应用能够模拟、延伸和扩展人类智能的理论、方法和技术,包括机器人、语言识别、图像
- 嵌入式与物联网开发是当今信息技术领域的两大重要分支,它们相互交织,共同推动着智能化时代的进步 嵌入式开发主要关注在嵌入式操作
- 网络安全,这一看似高深莫测的领域,实则与我们每个人的生活息息相关
- 毕业设计基于深度学习的视觉问答系统源码+文档说明+答辩PPT.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功