#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 |