c++ wndow读写数据结构到文件

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值