typedef struct tagTestListItem
{
char ClientIP[64];
char ServerIP[64];
char ServerID[64];
char ClientUser[64];
int OperType;
char OperDate[32];
char OperContent[512];
long adddate;
long pushdate;
long writefiledate;
long readandsenddat;
long readandsenddate;
}TestListItem, *pTestListItem;
BOOL CXXXXXLog::WriteItemLogFile()
{
HANDLE pFile;
DWORD dwBytesWrite, dwBytesToWrite;
CStdString dirName = GetLogExecutableDirectory() + _T("TempData\\");
bool bFlagCreateDirFlag = log_create_dirctory(dirName);
if (bFlagCreateDirFlag == true)
m_nWriteFileNumber = 0;//重新创建目录后,表示是首次
if (m_nWriteFileNumber >= MAX_INT_MY_DEFINE)
m_nWriteFileNumber = 0;//文件索引大过最大值,重置成0
bool bFlagExitMaxOne = false;
int nCurrentIndex = 0;
CStdString fileitem;
CStdString strCurrentName;
bool bFlagExit = false;
while (m_nWriteFileNumber<MAX_INT_MY_DEFINE)
{
fileitem = "";
strCurrentName = "";
nCurrentIndex = m_nWriteFileNumber;
fileitem.Format(_T("\\%d.data"), m_nWriteFileNumber++);
strCurrentName = dirName + fileitem;
bFlagExit = IsFileExist(strCurrentName);
if (bFlagExit == false) //文件不存在,可以用
{
bFlagExitMaxOne = true;
break;
}
}
if (bFlagExitMaxOne == false)
{
//极段情况下,可能存在的问题,是索引大过20000000后重置为0(而这时0到20000000的索引文件也都存在,大约在1亿条记录),此时直接清空队列,不再写入文件
TestListItem * pitemTo;
while (m_logListQu.size() > 0)
{
pitemTo = m_logListQu.front();
m_logListQu.pop();
if (pitemTo)
{
delete pitemTo;
}
}
if (m_logListQu.size() == 0)
{
std::queue<TestListItem*> noEmpty;
//noEmpty得到了临时对象存储的内存块,临时对象得到了noEmpty的内存块
//临时对象销毁立马回收内存
m_logListQu.swap(noEmpty);
}
return FALSE; //应该出错了,日记超过int最大值了,不正常
}
CStdString fileitemTemp;
fileitemTemp.Format(_T("\\%d.data"), nCurrentIndex);
CStdString stdFileName = dirName + fileitemTemp;
//CStdStringW stdFileName= ConvFromNetwork(fileName);
pFile = CreateFile(stdFileName.c_str(), GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS, //总是创建文件
FILE_ATTRIBUTE_NORMAL,
NULL);
if (pFile == INVALID_HANDLE_VALUE)
{
printf("create file error!\n");
CloseHandle(pFile);
return FALSE;
}
//设置偏移量 到文件尾部 配合OPEN_EXISTING使用 可实现追加写入文件
SetFilePointer(pFile, NULL, NULL, FILE_END);
TestListItem * pitemTo;
dwBytesToWrite = sizeof(TestListItem);
int nIndex = 0;
while (m_logListQu.size() > 0)
{
pitemTo = m_logListQu.front();
pitemTo->writefiledate = clock();
m_logListQu.pop();
if (pitemTo)
{
WriteFile(pFile, pitemTo, dwBytesToWrite, &dwBytesWrite, NULL);
nIndex++;
delete pitemTo;
if (nIndex > WRITE_LOG_ITEM_NUMBER)
break;
}
}
//刷新文件缓冲区
FlushFileBuffers(pFile);
CloseHandle(pFile);
return TRUE;
}
int CXXXXXLog::ReadItemLogFile(CStdStringW stdFileName)
{
int nDataNumber = 0;
HANDLE hFile = CreateFile(stdFileName.c_str(),
GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE == hFile) // 判断文件是否创建成功
{
cout << "打开文件失败" << endl;
return 0;
}
DWORD fileSize = GetFileSize(hFile, NULL); //得到文件的大小
//char *buffer, *tmpBuf;
DWORD dwBytesRead = 0;
DWORD dwBytesToReadTotal = fileSize;
//memset(buffer, 0, 2048 * sizeof(char));
DWORD dwBytesToRead = sizeof(TestListItem);
//buffer = (char *)malloc(fileSize);
TestListItem ItemlogData;
char buffertemp[1024] = { 0 };
string strTotal = "[";
bool bAddFlag = false;
do { //循环读文件,确保读出完整的文件
memset(&ItemlogData, 0x00, sizeof(TestListItem));
memset(buffertemp, 0x00, sizeof(buffertemp));
ReadFile(hFile, &ItemlogData, dwBytesToRead, &dwBytesRead, NULL);
if (dwBytesRead == 0)
break;
//把文件变成字符串
if (bAddFlag == true)
{
strTotal += ",";
}
if (m_bEnableLogging == 1)
{
ItemlogData.readandsenddate = clock();
char logchar[1024] = { 0 };
sprintf(logchar, "Current Log ServerId = %s OperType = %d OperContent = %s OperDate = %s adddate = %d pushdate = %d ,writedate = %d readandsenddate = %d\r\n", ItemlogData.ServerID, ItemlogData.OperType, ItemlogData.OperContent, ItemlogData.OperDate, ItemlogData.adddate, ItemlogData.pushdate, ItemlogData.writefiledate, ItemlogData.readandsenddate);
DebugWrite(logchar, strlen(logchar));
if (timeLogToSend < ItemlogData.adddate)
timeLogToSend = ItemlogData.adddate;
//计算时差,如果相差太大,要做debug测试
{//加入到当前的时间差
double nMscSec = (double)(ItemlogData.readandsenddate - ItemlogData.adddate) / CLOCKS_PER_SEC * 1000;
if (nMscSec > 180000)
{
char logchar[512] = { 0 };
sprintf(logchar, "Time Diff Is too loon OperDate = %s And CurreateTime = %s ServerId = %s adddate = %d pushdate = %d ,writedate = %d readandsenddate = %d \r\n", ItemlogData.OperDate, this->GetUnitTIme().c_str(), ItemlogData.ServerID, ItemlogData.adddate, ItemlogData.pushdate, ItemlogData.writefiledate, ItemlogData.readandsenddate);
DebugWrite(logchar, strlen(logchar));
}
}
}
sprintf(buffertemp, "{\"ClientIP\":\"%s\",\"ClientUser\":\"%s\",\"OperContent\":\"%s\",\"OperDate\":\"%s\",\"OperType\":\"%d\",\"ServerID\":\"%s\",\"ServerIP\":\"%s\"}", ItemlogData.ClientIP, ItemlogData.ClientUser, ItemlogData.OperContent, ItemlogData.OperDate, ItemlogData.OperType, ItemlogData.ServerID, ItemlogData.ServerIP);
strTotal += buffertemp;
bAddFlag = true;
nDataNumber++;
dwBytesToReadTotal -= dwBytesRead;
if (dwBytesToReadTotal<dwBytesToRead)
{
break;
}
// buffer += dwBytesRead;
} while (dwBytesToRead > 0);
CloseHandle(hFile);
if (bAddFlag == true)
{
strTotal += "]";
}
if (strTotal.length() > 10)
{
bool bFlag = SendMsgItemToLog(strTotal);
if (bFlag==true)
{//发送成功,则删除文件
DeleteFile(stdFileName);
}
return bFlag;
}
else
{//文件长度太小的应该是空文件,也要删除
DeleteFile(stdFileName);
}
return nDataNumber;
}