DragonNest/Server/ServiceMonitorEx/Source/LogFile.hpp

503 lines
14 KiB
C++
Raw Permalink Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< LOG FILE >>
PRGM : B4nFter
FILE : LOGFILE.HPP
DESC : <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INIT BUILT DATE : 2005. 01. 12
LAST BUILT DATE : 2007. 04. 10
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "LOGBASE.HPP"
#include "CRITICALSECTION.HPP"
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
#define DF_DEFAULT_LOGFILENAME _T("LOGFILE")
#define DF_DEFAULT_LOGEXTNAME _T("log")
#define DF_DEFAULT_LINEBUFFERSIZE (1024 * 64)
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CLogFile
//*---------------------------------------------------------------
// DESC : <20>α׸<CEB1> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
class CLogFile : public CLogBase
{
public:
typedef VOID (*LPFN_OUTPUT_LOGPROC)(LPCTSTR /*<2A>α<EFBFBD><CEB1>ؽ<EFBFBD>Ʈ*/, LPVOID /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>*/); // <20>ܺ<EFBFBD><DCBA><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
private:
FILE* m_lpLogFile;
TCHAR m_szFileName[MAX_PATH];
TCHAR m_szDirName[MAX_PATH];
TCHAR m_szExtName[MAX_PATH];
TCHAR m_szTextBuffer[DF_DEFAULT_LINEBUFFERSIZE];
SYSTEMTIME m_stCurSysTime;
SYSTEMTIME m_stSysTime;
CCriticalSection m_crLogFile;
public:
inline CLogFile();
inline ~CLogFile();
inline BOOL Create(
LPCTSTR lpszFileName = DF_DEFAULT_LOGFILENAME,
LPCTSTR lpszDirName = NULL,
LPCTSTR lpszExtName = DF_DEFAULT_LOGEXTNAME,
BOOL bAddDate = TRUE
);
inline VOID Close();
inline virtual BOOL Write(LPCTSTR lpszFormat, ...); // P.S.> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (*.h, *.cpp <20><> <20>и<EFBFBD> <20>ʿ<EFBFBD>)
inline virtual BOOL WriteDate(LPCTSTR lpszFormat, ...); // P.S.> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (*.h, *.cpp <20><> <20>и<EFBFBD> <20>ʿ<EFBFBD>)
inline virtual BOOL WriteDirect(LPCTSTR lpszText); // P.S.> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (*.h, *.cpp <20><> <20>и<EFBFBD> <20>ʿ<EFBFBD>)
inline VOID UpdateFileNameDate();
private:
inline BOOL Initialize();
inline VOID Finalize();
inline BOOL ChangeFileNameDate(SYSTEMTIME& stSysTime);
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::CLogFile
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CLogFile::CLogFile()
{
Initialize();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::~CLogFile
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CLogFile::~CLogFile()
{
Finalize();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::Initialize
//*---------------------------------------------------------------
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : N/A
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CLogFile::Initialize()
{
m_lpLogFile = NULL;
::memset(m_szDirName, 0, sizeof(m_szDirName));
::memset(m_szFileName, 0, sizeof(m_szFileName));
if (NOERROR != m_crLogFile.Open()) {
BASE_RETURN(FALSE);
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::Finalize
//*---------------------------------------------------------------
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CLogFile::Finalize()
{
Close();
m_crLogFile.Close();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::Create
//*---------------------------------------------------------------
// DESC : <20>αױ<CEB1><D7B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpszFileName - <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
// 2 . lpszDirName - <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>
// 3 . lpszExtName - <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20≯<EFBFBD>
// 4 . bAddDate - <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><>¥<EFBFBD><C2A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CLogFile::Create(LPCTSTR lpszFileName, LPCTSTR lpszDirName, LPCTSTR lpszExtName, BOOL bAddDate)
{
CLockAuto AutoLock(& m_crLogFile);
::GetLocalTime (& m_stSysTime);
m_stCurSysTime = m_stSysTime;
if (!lstrcmp(lpszFileName, _T(""))) {
STRNCPY(m_szFileName, DF_DEFAULT_LOGFILENAME, COUNT_OF(m_szFileName));
}
else {
STRNCPY(m_szFileName, lpszFileName, COUNT_OF(m_szFileName));
}
if (!lpszExtName || !lstrcmp(lpszExtName, _T(""))) {
::memset(m_szExtName, 0, sizeof(m_szExtName));
}
else {
STRNCPY(m_szExtName, lpszExtName, COUNT_OF(m_szExtName));
}
TCHAR szLogFileFullName[MAX_PATH];
if (!lpszDirName || !lstrcmp(lpszDirName, _T(""))) {
::memset(m_szDirName, 0, sizeof(m_szDirName));
if (bAddDate) {
SNPRINTF(MODE_DBG_EX(szLogFileFullName, COUNT_OF(szLogFileFullName)), COUNT_OF(szLogFileFullName),
_T(".\\%s_%04d%02d%02d%02d%02d%02d.%s"),
m_szFileName,
m_stSysTime.wYear,
m_stSysTime.wMonth,
m_stSysTime.wDay,
m_stSysTime.wHour,
m_stSysTime.wMinute,
m_stSysTime.wSecond,
m_szExtName
);
}
else {
SNPRINTF(MODE_DBG_EX(szLogFileFullName, COUNT_OF(szLogFileFullName)), COUNT_OF(szLogFileFullName),
_T(".\\%s.%s"),
m_szFileName,
m_szExtName
);
}
}
else {
STRNCPY(m_szDirName, lpszDirName, COUNT_OF(m_szDirName));
::CreateDirectory(m_szDirName, NULL);
if (bAddDate) {
SNPRINTF(MODE_DBG_EX(szLogFileFullName, COUNT_OF(szLogFileFullName)), COUNT_OF(szLogFileFullName),
_T("%s\\%s_%04d%02d%02d%02d%02d%02d.%s"),
m_szDirName,
m_szFileName,
m_stSysTime.wYear,
m_stSysTime.wMonth,
m_stSysTime.wDay,
m_stSysTime.wHour,
m_stSysTime.wMinute,
m_stSysTime.wSecond,
m_szExtName
);
}
else {
SNPRINTF(MODE_DBG_EX(szLogFileFullName, COUNT_OF(szLogFileFullName)), COUNT_OF(szLogFileFullName),
_T("%s\\%s.%s"),
m_szDirName,
m_szFileName,
m_szExtName
);
}
}
m_lpLogFile = _tfopen(szLogFileFullName, _T("a+b"));
if (!m_lpLogFile) {
BASE_TRACE(_T("!m_lpLogFile - CLogFile::Create()\n"));
return FALSE;
}
#if defined(_UNICODE)
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD> UCS-2 (Little Endian) <20><> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> 0xFF, 0xFE <20><> <20><> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٿ<EFBFBD><D9BF>־<EFBFBD><D6BE><EFBFBD> <20><>
::fputc(0xFF, m_lpLogFile);
::fputc(0xFE, m_lpLogFile);
#endif // _UNICODE
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::Close
//*---------------------------------------------------------------
// DESC : <20>αױ<CEB1><D7B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CLogFile::Close()
{
CLockAuto AutoLock(& m_crLogFile);
if (m_lpLogFile) {
::fclose (m_lpLogFile);
m_lpLogFile = NULL;
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::Write
//*---------------------------------------------------------------
// DESC : <20>α׸<CEB1> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><>¥<EFBFBD><C2A5><EFBFBD><EFBFBD>)
// PARM : 1 . lpszFormat - <20>α׳<CEB1><D7B3><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CLogFile::Write(LPCTSTR lpszFormat, ...)
{
if (!m_lpLogFile) {
BASE_TRACE(_T("!m_lpLogFile - CLogFile::WriteDate()\n"));
return FALSE;
}
va_list lpArgPtr;
INT iChrWritten;
CLockAuto AutoLock(& m_crLogFile);
va_start(lpArgPtr, lpszFormat);
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
iChrWritten = _vsntprintf_s(m_szTextBuffer, COUNT_OF(m_szTextBuffer), lpszFormat, lpArgPtr);
#else // #if (_MSC_VER >= 1400)
#pragma warning (disable:4995)
iChrWritten = _vsntprintf(m_szTextBuffer, COUNT_OF(m_szTextBuffer), lpszFormat, lpArgPtr);
#pragma warning (default:4995)
#endif // #if (_MSC_VER >= 1400)
va_end(lpArgPtr);
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_ftprintf_s(m_lpLogFile, _T("%s\r\n"), m_szTextBuffer);
#else // #if (_MSC_VER >= 1400)
_ftprintf(m_lpLogFile, _T("%s\r\n"), m_szTextBuffer);
#endif // #if (_MSC_VER >= 1400)
// !!! <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ?
/*
if (m_lpLogLink) {
m_lpLogLink->Write(lpszFormat, lpArgPtr);
}
*/
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::WriteDate
//*---------------------------------------------------------------
// DESC : <20>α׸<CEB1> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><>¥<EFBFBD><C2A5><EFBFBD><EFBFBD>)
// PARM : 1 . lpszFormat - <20>α׳<CEB1><D7B3><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CLogFile::WriteDate(LPCTSTR lpszFormat, ...)
{
if (!m_lpLogFile) {
BASE_TRACE(_T("!m_lpLogFile - CLogFile::WriteDate()\n"));
return FALSE;
}
va_list lpArgPtr;
INT iChrWritten;
CLockAuto AutoLock(& m_crLogFile);
va_start(lpArgPtr, lpszFormat);
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
iChrWritten = _vsntprintf_s(m_szTextBuffer, COUNT_OF(m_szTextBuffer), lpszFormat, lpArgPtr);
#else // #if (_MSC_VER >= 1400)
#pragma warning (disable:4995)
iChrWritten = _vsntprintf(m_szTextBuffer, COUNT_OF(m_szTextBuffer), lpszFormat, lpArgPtr);
#pragma warning (default:4995)
#endif // #if (_MSC_VER >= 1400)
va_end(lpArgPtr);
::GetLocalTime(& m_stSysTime);
// <20><><EFBFBD>Ϸα<CFB7><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>¥<EFBFBD><C2A5> <20>̾<EFBFBD><CCBE><EFBFBD> <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>/<2F><>/<2F><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_ftprintf_s(m_lpLogFile, _T("%04d-%02d-%02d %02d:%02d:%02d %s\r\n"),
#else // #if (_MSC_VER >= 1400)
_ftprintf(m_lpLogFile, _T("%04d-%02d-%02d %02d:%02d:%02d %s\r\n"),
#endif // #if (_MSC_VER >= 1400)
m_stSysTime.wYear,
m_stSysTime.wMonth,
m_stSysTime.wDay,
m_stSysTime.wHour,
m_stSysTime.wMinute,
m_stSysTime.wSecond,
m_szTextBuffer
);
// !!! <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ?
/*
if (m_lpLogLink) {
m_lpLogLink->WriteDate(lpszFormat, lpArgPtr);
}
*/
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::WriteDirect
//*---------------------------------------------------------------
// DESC : <20>α׸<CEB1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpszText - <20>α׳<CEB1><D7B3><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CLogFile::WriteDirect(LPCTSTR lpszText)
{
if (!m_lpLogFile) {
BASE_TRACE(_T("!m_lpLogFile - CLogFile::WriteDirect()\n"));
return FALSE;
}
CLockAuto AutoLock(& m_crLogFile);
#if (_MSC_VER >= 1400) // VS.NET 2005 <20>̻<EFBFBD>
_ftprintf_s(m_lpLogFile, _T("%s\r\n"), lpszText);
#else // #if (_MSC_VER >= 1400)
_ftprintf(m_lpLogFile, _T("%s\r\n"), lpszText);
#endif // #if (_MSC_VER >= 1400)
// !!! <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ?
/*
if (m_lpLogLink) {
m_lpLogLink->WriteDirect(lpszText);
}
*/
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::UpdateFileNameDate
//*---------------------------------------------------------------
// DESC : <20><>¥<EFBFBD><C2A5> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> Ȯ<><C8AE><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CLogFile::UpdateFileNameDate()
{
CLockAuto AutoLock(& m_crLogFile);
::GetLocalTime(& m_stSysTime);
if (m_stSysTime.wDay != m_stCurSysTime.wDay) {
ChangeFileNameDate(m_stSysTime);
m_stCurSysTime = m_stSysTime;
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLogFile::ChangeFileNameDate
//*---------------------------------------------------------------
// DESC : <20>Էµ<D4B7> <20><>¥<EFBFBD><C2A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . stSysTime - <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>¥
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CLogFile::ChangeFileNameDate(SYSTEMTIME& stSysTime)
{
if (m_lpLogFile) {
::fclose(m_lpLogFile);
m_stSysTime = stSysTime;
TCHAR szLogFileFullName[MAX_PATH];
if (!lstrcmp(m_szDirName, _T(""))) {
SNPRINTF(MODE_DBG_EX(szLogFileFullName, COUNT_OF(szLogFileFullName)), COUNT_OF(szLogFileFullName),
_T(".\\%s_%04d%02d%02d%02d%02d%02d.%s"),
m_szFileName,
m_stSysTime.wYear,
m_stSysTime.wMonth,
m_stSysTime.wDay,
m_stSysTime.wHour,
m_stSysTime.wMinute,
m_stSysTime.wSecond,
m_szExtName
);
}
else {
::CreateDirectory(m_szDirName, NULL);
SNPRINTF(MODE_DBG_EX(szLogFileFullName, COUNT_OF(szLogFileFullName)), COUNT_OF(szLogFileFullName),
_T("%s\\%s_%04d%02d%02d%02d%02d%02d.%s"),
m_szDirName,
m_szFileName,
m_stSysTime.wYear,
m_stSysTime.wMonth,
m_stSysTime.wDay,
m_stSysTime.wHour,
m_stSysTime.wMinute,
m_stSysTime.wSecond,
m_szExtName
);
}
if (!(m_lpLogFile = _tfopen(szLogFileFullName, _T("a+")))) {
BASE_TRACE(_T("!(m_lpLogFile = _tfopen(szLogFileFullName, _T(\"a+\"))) - CLogFile::ChangeFileNameDate()\n"));
return FALSE;
}
}
return TRUE;
}