#ifndef _LOGFILE_H #define _LOGFILE_H #include <assert.h> #include <time.h> #include <stdio.h> #include <windows.h> class
LogFile { protected : CRITICAL_SECTION _csLock; char
* _szFileName; HANDLE
_hFile; bool
OpenFile() //打开文件, 指针到文件尾 { if (IsOpen()) return
true ; if (!_szFileName) return
false ; _hFile = CreateFile( _szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (!IsOpen() && GetLastError() == 2) //打开不成功, 且因为文件不存在, 创建文件 _hFile = CreateFile( _szFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if (IsOpen()) SetFilePointer(_hFile, 0, NULL, FILE_END); return
IsOpen(); } DWORD
Write( LPCVOID
lpBuffer, DWORD
dwLength) { DWORD
dwWriteLength = 0; if (IsOpen()) WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL); return
dwWriteLength; } virtual
void WriteLog( LPCVOID
lpBuffer, DWORD
dwLength) //写日志, 可以扩展修改 { time_t
now; char
temp[21]= "" ; DWORD
dwWriteLength; if (IsOpen()) { time (&now); strftime (temp, 20, "%Y-%m-%d %H:%M:%S" , localtime (&now)); char
* pTime= "Time:" ; char
* pEvent= " Event:" ; char
* pEnd= "\r\n" ; WriteFile(_hFile, pTime, strlen (pTime), &dwWriteLength, NULL); WriteFile(_hFile, temp, strlen (temp), &dwWriteLength, NULL); WriteFile(_hFile, pEvent, strlen (pEvent), &dwWriteLength, NULL); WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL); WriteFile(_hFile, pEnd, strlen (pEnd), &dwWriteLength, NULL); FlushFileBuffers(_hFile); } } void
Lock() { ::EnterCriticalSection(&_csLock); } void
Unlock() { ::LeaveCriticalSection(&_csLock); } public : LogFile( const
char *szFileName = "Log.log" ) //设定日志文件名 { _szFileName = NULL; _hFile = INVALID_HANDLE_VALUE; ::InitializeCriticalSection(&_csLock); SetFileName(szFileName); } virtual
~LogFile() { ::DeleteCriticalSection(&_csLock); Close(); if (_szFileName) { delete
[]_szFileName; _szFileName=NULL; } } const
char * GetFileName() { return
_szFileName; } void
SetFileName( const
char *szName) //修改文件名, 同时关闭上一个日志文件 { assert (szName); if (_szFileName) { delete
[]_szFileName; _szFileName=NULL; } Close(); _szFileName = new
char [ strlen (szName) + 1]; assert (_szFileName); strcpy (_szFileName, szName); } bool
IsOpen() { return
_hFile != INVALID_HANDLE_VALUE; } void
Close() { if (IsOpen()) { CloseHandle(_hFile); _hFile = INVALID_HANDLE_VALUE; } } void
Log( LPCVOID
lpBuffer, DWORD
dwLength) //追加日志内容 { assert (lpBuffer); __try { Lock(); if (!OpenFile()) return ; WriteLog(lpBuffer, dwLength); } __finally { Unlock(); } } void
Log( const
char *szText) { Log(szText, strlen (szText)); } private : //屏蔽函数 LogFile( const
LogFile&); LogFile&operator = ( const
LogFile&); }; class
LogFileEx : public
LogFile { protected : char
*_szPath; char
_szLastDate[9]; int
_iType; void
SetPath( const
char *szPath) { assert (szPath); WIN32_FIND_DATA wfd; char
temp[MAX_PATH + 1] = {0}; if (FindFirstFile(szPath, &wfd) == INVALID_HANDLE_VALUE && CreateDirectory(szPath, NULL) == 0) { strcat ( strcpy (temp, szPath), " Create Fail. Exit Now! Error ID :" ); ltoa(GetLastError(), temp + strlen (temp), 10); MessageBox(NULL, temp, "Class LogFileEx" , MB_OK); exit (1); } else { GetFullPathName(szPath, MAX_PATH, temp, NULL); _szPath = new
char [ strlen (temp) + 1]; assert (_szPath); strcpy (_szPath, temp); } } public : enum
LOG_TYPE{YEAR = 0, MONTH = 1, DAY = 2}; LogFileEx( const
char *szPath = "." , LOG_TYPE iType = MONTH) { _szPath = NULL; SetPath(szPath); _iType = iType; memset (_szLastDate, 0, 9); } ~LogFileEx() { if (_szPath) { delete
[]_szPath; _szPath=NULL; } } const
char * GetPath() { return
_szPath; } void
Log( LPCVOID
lpBuffer, DWORD
dwLength) { assert (lpBuffer); char
temp[10]; static
const char format[3][10] = { "%Y" , "%Y-%m" , "%Y%m%d" }; __try { Lock(); time_t
now = time (NULL); strftime (temp, 9, format[_iType], localtime (&now)); if ( strcmp (_szLastDate, temp) != 0) //更换文件名 { //基类的文件名大小已改变,这里也要改,不然基类delete失改. char
* backslash= "//" ; char
* suffix= ".log" ; if
(_szFileName) { delete
[] _szFileName; _szFileName= new
char [ strlen (_szPath)+ strlen (temp)+ strlen (backslash)+ strlen (suffix)+1]; } strcat ( strcpy (_szFileName, _szPath), backslash); strcat ( strcat (_szFileName, temp), suffix); strcpy (_szLastDate, temp); Close(); } if (!OpenFile()) return ; WriteLog(lpBuffer, dwLength); } __finally { Unlock(); } } void
Log( const
char *szText) { Log(szText, strlen (szText)); } private : //屏蔽函数 LogFileEx( const
LogFileEx&); LogFileEx&operator = ( const
LogFileEx&); }; #endif |
原文:http://www.cnblogs.com/pugna/p/3724387.html