#include "stdafx.h" #include "logger.h" #include #include #include #include #include #include #include #include using namespace std; void CLogger::SendAtTime(const TCHAR* buffer) { EnterCriticalSection(&m_lockLogger); if (!m_File) { m_File = _wfsopen(m_FileName, _T("at"), _SH_DENYWR); } if (m_File) { CTime _cTime = CTime::GetCurrentTime(); CString csTime = _cTime.Format("[%m/%d %H:%M] "); _ftprintf(m_File,_T("%s"), csTime); _ftprintf(m_File, _T("%s\r\n"), buffer); } LeaveCriticalSection(&m_lockLogger); } void CLogger::Send(LPCTSTR format, ...) { EnterCriticalSection(&m_lockLogger); if (!m_File) { m_File = _wfsopen(m_FileName, _T("at"), _SH_DENYWR); } int length = 0; va_list list; va_start(list, format); length = vswprintf_s(m_Str, 5000, format, list); if (m_File) { _ftprintf(m_File, m_Str); } va_end(list); LeaveCriticalSection(&m_lockLogger); } void CLogger::SendAndFlush(LPCTSTR format, ...) { EnterCriticalSection(&m_lockLogger); int length = 0; va_list list; va_start(list, format); length = vswprintf_s(m_Str2, 5000, format, list); Send(m_Str2); if (m_File) { fclose(m_File); m_File = nullptr; if (m_FileName.GetLength() > 0) m_File = _wfsopen(m_FileName, _T("at"), _SH_DENYWR); } va_end(list); LeaveCriticalSection(&m_lockLogger); } //vswprintf_s() //参考连接:https://www.educative.io/answers/what-is-vswprintfs-in-c void CLogger::SendAndFlushWithTime(LPCTSTR format, ...) { EnterCriticalSection(&m_lockLogger); if (!IsEnabledLog) { return; } if (!m_File) { m_File = _wfsopen(m_FileName, _T("at"), _SH_DENYNO); //追加 } if (m_File) { int length = 0; va_list list; //在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 va_start(list, format); //vswprintf()函数将宽字符串写入宽字符串缓冲区 //ws:指定指向给定宽字符串缓冲区的指针,该缓冲区将存储结果 //len : 指定写回缓冲区的宽字符的最大长度,包括终止的空字符 //format : 指定指向空终止的宽字符串的指针 //arg : 指定标识变量参数列表的值 length = vswprintf(m_Str2, 5000, format, list); CTime _cTime = CTime::GetCurrentTime(); CString csTime = _cTime.Format("[%Y/%m/%d %H:%M:%S"); struct _timeb timebuffer; _ftime64_s(&timebuffer); if (m_File) { _ftprintf(m_File, _T("%s:%03d] "), csTime, timebuffer.millitm); } if (m_File) { _ftprintf(m_File, m_Str2); } if (m_File) { fclose(m_File); m_File = nullptr; } va_end(list); } //放弃当前线程对锁定部分的所有权。一旦锁定部分的所有权被放弃,那么请求访问临界区的下一个线程,将可以对锁定部分进行操作。每一个调用EnterCriticalSection的线程,都应该调用一次LeaveCriticalSection。 //使一个线程可以使用一个临界段对象来进行互斥同步。这个过程需要优先创建一个临界区结构体变量(分配使用内存)。在使用临界区之前, 待操作临界区的进程必须调用InitializeCriticalSection 或者 InitializeCriticalSectionAndSpinCount函数来初始化临界区。 // 一个线程使用EnterCriticalSection 或TryEnterCriticalSection函数来获得关键部分对象的所有权时,该线程必须在离开临界区时调用LeaveCriticalSection。 LeaveCriticalSection(&m_lockLogger); } void CLogger::SendAndFlushPerMode(LPCTSTR format, ...) { EnterCriticalSection(&m_lockLogger); int length = 0; va_list list; va_start(list, format); length = vswprintf_s(m_Str2, 5000, format, list); Send(m_Str2); if ((m_lLogMask & LOGFLUSH) && m_File) { fclose(m_File); m_File = nullptr; if (m_FileName.GetLength() > 0) m_File = _wfsopen(m_FileName, _T("at"), _SH_DENYWR); } va_end(list); LeaveCriticalSection(&m_lockLogger); } string ConvertCharToString(char* a, int size) { int i; string s = ""; for (i = 0; i < size; i++) { s = s + a[i]; } return s; } //删除指定目录以及目录下的所有文件 void DelFiles(string path) { //在目录后面加上"\\*.*"进行第一次搜索 string newDir = path + "\\*.*"; //用于查找的句柄 intptr_t handle; struct _finddata_t fileinfo; //第一次查找 handle = _findfirst(newDir.c_str(), &fileinfo); if (handle == -1) { //cout << "无文件" << endl; system("pause"); return; } do { if (fileinfo.attrib & _A_SUBDIR) { //如果为文件夹,加上文件夹路径,再次遍历 if (strcmp(fileinfo.name, ".") == 0 || strcmp(fileinfo.name, "..") == 0) continue; // 在目录后面加上"\\"和搜索到的目录名进行下一次搜索 newDir = path + "\\" + fileinfo.name; DelFiles(newDir.c_str()); //先遍历删除文件夹下的文件,再删除空的文件夹 cout << newDir.c_str() << endl; if (_rmdir(newDir.c_str()) == 0) { //删除空文件夹 cout << "delete empty dir success" << endl; } else { cout << "delete empty dir error" << endl; } } else { string file_path = path + "\\" + fileinfo.name; cout << file_path.c_str() << endl; if (remove(file_path.c_str()) == 0) { //删除文件 cout << "delete file success" << endl; } else { cout << "delete file error" << endl; } } } while (!_findnext(handle, &fileinfo)); _findclose(handle); } string ByteArrayToString(byte byteArray[]) { char str[sizeof(byteArray) + 1]; memcpy(str, byteArray, sizeof(byteArray)); str[sizeof(byteArray)] = '\0'; return str; }