⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virtualinfofile.cpp

📁 mcgs的数据导出源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
	}

	//删除掉不正常的info数据
RESTART:
	for (int i = 0; i < ARRAYSIZE(m_arraySaveInfo); i++ )
	{
		if(m_arraySaveInfo[i].m_bValid == FALSE)
		{
			m_arraySaveInfo.RemoveAt(i);
			goto RESTART;
		}
	}
	return S_FILE_OK;

}


CVirtualSaveFile* CVirtualInfoFile::SvrCreateNewSaveFile( 
						CString strFileName, 
						MCGSDATETIME timeStart, 
						MCGSDATETIME timeEnd )
{
	CVirtualSaveStruct c;
	c.m_strFileName = strFileName;
	c.m_timeEnd = timeEnd;
	c.m_timeStart = timeStart;
	m_arraySaveInfo.Add(c);
	CVirtualSaveFile* pFile = c.SvrCreateSaveFile (this);
	return pFile;
}

FILE_ERROR CVirtualInfoFile::SvrLoadSaveFile( )
{
	//首先试图从SysInfo.dat里读取,如果没有,就认为这是
	//一个老工程,从文件读取。
	CString strPath ;//= McgsGetPath( m_strFileName );
	CString	strVar;// = McgsGetFileName( m_strFileName );
	CString strName ;//= McgsGetFileNameEx( m_strFileName );
	CString strBakFile ;//= strPath + _T("\\") + strVar + _T("\\") + strName;
	CString strFileName = _T("d:\\ph\\MCGS_DATE.ini");

	BYTEARRAY buff;	//一次性从文件中装载完数据

	TRY
	{
		CFile  file;
		
		if( !file.Open( strFileName, CFile::modeRead ) )
			return S_FILE_READ_FAIL;
		DWORD   buffer_size = 0;
		buff.SetSize( (long)file.GetLength() );
		file.Read( buff.GetData(), buff.GetSize() );
		// 读数据
		file.Close();

	}
	CATCH( CFileException, e )
	{
		e->Delete();
		TRACE( _T("file %s--%s  open fail\n"), m_strFileName, strBakFile );
		return S_FILE_READ_FAIL;
	}
	END_CATCH


	{
		CByteArray dataBuff;
		//lzlzlz 2003.6.16
		COwnerArchive ar(COwnerArchive::storing);
		ar.SvrWrite (buff);
		ar.SvrSeekToBegin ();
		ar.SvrChangeMode (COwnerArchive::load);
		int size;
		ar >> size;
		for (int i=0; i<size;++i)
		{
			//得到组对象成员类型
			int iNum;
			ar >> iNum;
			for (int j=0;j<iNum;++j)
			{
				ar >> m_GrpObjInfo[j].m_type;
			}
			ar >> m_timeEnd;
			ar >> m_timeStart;
			DWORD dwSize = 0;
			ar >> dwSize;			
			m_arraySaveInfo.SetSize(0);
			for (DWORD i = 0 ; i < dwSize ; i ++)
			{
				CVirtualSaveStruct c;
			//	c.m_strGroupObjName = McgsGetFileName(m_strFileName);
			//	c.m_strDataSavePath = McgsGetPath(m_strFileName);
				c.Serialize (ar);
				m_arraySaveInfo.Add(c);
			}
		}
	}

	if( ARRAYSIZE(m_arraySaveInfo) > 0 )
	{
		m_pCurSaveFile = m_arraySaveInfo[ ARRAYSIZE(m_arraySaveInfo) - 1 ].SvrCreateSaveFile(this);
		if(NULL != m_pCurSaveFile)
		{
			//penghong add 为了修改从info读取的时间04-5-29
			MCGSDATETIME timestart,timeend;
			
			timestart = m_pCurSaveFile->SvrGetStartTime();
			timeend = m_pCurSaveFile->SvrGetEndTime();		
			if ( m_timeStart > timestart ) m_timeStart = timestart;
			if ( m_timeEnd < timeend ) m_timeEnd = timeend;
			//penghong add 为了修改从info读取的时间04-5-29	
		}
		else
		{
			int iIndex = ARRAYSIZE(m_arraySaveInfo) - 1;
			ARRAYREMOVE(m_arraySaveInfo,iIndex);
		}
	}

	return S_FILE_OK;
}

DWORD CVirtualInfoFile::mfFindOldRec( CFile& file )
{
	BYTEARRAY buff;
	DWORD dwSize = file.GetLength();
	ARRAYRESIZE( buff, (long)dwSize );
	file.Read( ARRAYDATA(buff), (long)dwSize );
	if ( dwSize == 0 )
		return (DWORD)0;
#ifdef _DEBUG
//	TRACE (_T("read") );
//	TRACE ( _T("数目:%d"), (long)dwSize );
//	for ( int k = 0; k < ARRAYSIZE(buff); k++ )
//	{
//		TRACE (_T("%d "), buff[k] );
//	}
//	TRACE (_T("\n") );
#endif//#ifdef _DEBUG
	
	long lngPos = 0;
	long lngOldPos = 0;
	CString strFileName;
	COleDateTime timeBegin, timeEnd;
	while ( lngPos < ARRAYSIZE(buff) )
	{
		lngOldPos = lngPos;
		long lngSize = 0;
		memcpy ( &lngSize, ARRAYDATA(buff)+lngPos, sizeof(long) );
		lngPos += sizeof(long);
		BYTEARRAY buffRec;
		ARRAYRESIZE( buffRec, lngSize );
		memcpy ( ARRAYDATA(buffRec), ARRAYDATA(buff)+lngPos, lngSize );
		lngPos += lngSize;

		COwnerArchive ar( COwnerArchive::storing );
		ar.SvrWrite( buffRec );
		ar.SvrSeekToBegin();
		ar.SvrChangeMode( COwnerArchive::load );
		ar >> timeBegin;
		ar >> timeEnd;
		ar >> strFileName;
	}

	return lngOldPos;
}

/*
CString CVirtualInfoFile::mfGetDirectoryPath( CString strFileFullName )
{
	int iPos = m_strFileName.ReverseFind(_T('.'));
	CString strPath = m_strFileName.Left( iPos ) + CString(_T("\\")); 
	return strPath;
}
*/

CVirtualSaveStruct::CVirtualSaveStruct()
{
	m_bValid = TRUE;
	m_strGroupObjName = _T("");
	m_strDataSavePath = _T("");
}

CVirtualSaveStruct::~CVirtualSaveStruct()
{
}

CVirtualSaveFile* CVirtualSaveStruct::SvrCreateSaveFile(CVirtualInfoFile* pInfoFile,BOOL bLoadFromExistFile)
{
	//从本对象中生成一个存盘文件

	CVirtualSaveFile* pFile = new CVirtualSaveFile(this->m_strFileName,this->m_timeStart ,this->m_timeEnd );
	//lzlzlz
	pFile->m_pInfoFile = pInfoFile;

	if(S_FILE_BE_BAD == pFile ->SvrLoadSaveBlock(true,bLoadFromExistFile))
	{
		delete pFile;
		pFile = NULL;
		return NULL;
	}
	return pFile;
}


void CVirtualSaveStruct::Serialize(COwnerArchive& ar)
{
	if (ar.IsStoring ())
	{
		//删除掉存盘路径再保存,否则太浪费空间了
		CString strShortName ;
		//CString strShortName = McgsGetFileNameEx(m_strFileName);
		ar << strShortName;
		ar << m_timeStart;
		ar << m_timeEnd;
	}
	else
	{
		//如果读到的是短路径,补上存盘路径
		CString strTmpName;
		ar >> strTmpName;
		if(strTmpName.Find(_T('\\')) == -1)
		{
			if(m_strGroupObjName.IsEmpty() || m_strDataSavePath.IsEmpty())
			{
				ASSERT(FALSE);
				return;
			}
			//短名
			m_strFileName.Format(_T("%s\\%s\\%s"), m_strDataSavePath,m_strGroupObjName,strTmpName) ;
		}
		else
		{
			m_strFileName = strTmpName;
		}
//		::AfxMessageBox(m_strFileName); 
		ar >> m_timeStart;
		ar >> m_timeEnd;

		/*CTime t1(m_timeStart);
		CTime t2(m_timeEnd);
		CString str,str1;
		str=t1.Format("%Y-%m-%d,%H:%M:%S");
		str1=t2.Format("%Y-%m-%d,%H:%M:%S");
		::AfxMessageBox(str); 
		::AfxMessageBox(str1); */
	}
}

int CVirtualInfoFile::mfStoreCurSaveFileInfo()
{
	if (m_pCurSaveFile != NULL)
	{
		//查找对应的东西并保存
		for (int i = 0 ; i < m_arraySaveInfo.GetSize() ; i ++)
		{
			if (m_arraySaveInfo[i].m_strFileName.CompareNoCase(m_pCurSaveFile->m_strFileName ) == 0)
			{
				m_arraySaveInfo[i].m_timeEnd = m_pCurSaveFile->m_timeEnd;
				m_arraySaveInfo[i].m_timeStart = m_pCurSaveFile->m_timeStart;
				return i;
			}
		}
		
		CVirtualSaveStruct c;
		c.m_strFileName = m_pCurSaveFile->m_strFileName;
		c.m_timeEnd = m_pCurSaveFile->m_timeEnd;
		c.m_timeStart = m_pCurSaveFile->m_timeStart;
		m_arraySaveInfo.Add(c);
		return m_arraySaveInfo.GetSize () - 1;
	}
	return -1;
}

int CVirtualInfoFile::mfGetCurReadFileInfo()
{
	if (m_pCurReadFile != NULL)
	{
		//查找对应的东西并保存
		for (int i = 0 ; i < m_arraySaveInfo.GetSize() ; i ++)
		{
			if (m_arraySaveInfo[i].m_strFileName.CompareNoCase(
				m_pCurReadFile->m_strFileName ) == 0)
			{
				return i;
			}
		}

		return - 1;
	}
	return -1;
}

// 增加的函数
// add by dagger 2003.3.3
BOOL CVirtualInfoFile::SvrDeleteForSpace()
{
	// 如果只有一个文件,可能性不大,要么就是硬盘空间太小
	// 如果没有文件,还能进来,真是神了。
	// 所以必须有两个文件以上才行
	if( m_arraySaveInfo.GetSize() <= 1 )
		return FALSE;
	// 删掉第一个存盘文件,如果没删掉就返回出错
	if( DeleteFile( m_arraySaveInfo[ 0 ].m_strFileName ) == FALSE )
		return FALSE;
	TRACE( _T( "文件%s被成功的删掉了!!\n" ), m_arraySaveInfo[ 0 ].m_strFileName  );
	//删掉第一个存盘文件数组
	m_arraySaveInfo.RemoveAt( 0 );
	// 现在第一个文件就是以前的第二个文件,
	// 所以开始时间就变成了以前第二个文件的开始时间
	m_timeStart = m_arraySaveInfo[ 0 ].m_timeStart;
	// 从新写infofile;
	//SvrFreshInfoToDisk();减少刷盘
	return TRUE;
}
// end add;
//目前设计为不经常修改infofile

//lzlzlz 2003.6.24 {
/////////////
//CVirtualDBQuery
CVirtualDBQuery::CVirtualDBQuery(COleDateTime tBegin, 
								 COleDateTime tEnd, 
								 long tBeginMs, 
								 long tEndMs,
								 DWORD dwStyle)
{
	m_tBegin = tBegin;
	m_tEnd = tEnd;
	m_lBeginMs = tBeginMs;
	m_lEndMs = tEndMs;
	m_dwStyle = dwStyle;
	m_tLast = m_tBegin;
	m_dtBegin = 0.0;
	m_dtEnd = 0.0;
}

bool CVirtualDBQuery::SvrPrepare(COleDateTime tCur, long lMSCur)
{
	if(tCur < m_tBegin || tCur > m_tEnd)
	{
		return false;
	}
	
	/*if(CVirtualInfoFile::m_exStatus == CVirtualInfoFile::MCGS_FORHISPIC)
	{
		//获取用户设定时间间隔
		COleDateTimeSpan tStep(CVirtualInfoFile::m_fStep / 24 / 3600);
		if(tCur - m_tLast < tStep)
		{
			return false;
		}
	}*/ //zzm 2003-7-16 这段代码无用

	if((m_dwStyle & MCGS_READDATA_MSECOND) == MCGS_READDATA_MSECOND)
	{
		double dtBegin = m_tBegin.m_dt + (double)m_lBeginMs / 24 / 3600 / 1000;
		double dtEnd = m_tEnd.m_dt + (double)m_lEndMs / 24 / 3600 / 1000;
		double dtCur = tCur.m_dt + (double)lMSCur / 24 / 3600 / 1000;
		if(dtCur < dtBegin || dtCur > dtEnd)
		{
			return false;
		}
	}

	m_tLast = tCur;

	return true;
}
//lzlzlz 2003.6.24 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -