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

📄 mergedata.cpp

📁 网络游戏龙族 完整的登陆器 C++ 源代码
💻 CPP
字号:
// MergeData.cpp: implementation of the CMergeData class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "MergeData.h"


//////////////////////////////////////////////////////////////////////
// CFileMerge

CFileMerge::~CFileMerge()
{
	Clear();
}

CFileMerge& CFileMerge::operator=( CFileMerge &rhs)
{
	if( this == &rhs)
	{
		return *this;
	}
	this->Clear();
	//this->SetFileName( rhs.GetFileList() );
//	this->OpenFile("wrb"); 

	return *this;
}

void CFileMerge::Clear()
{
	if( !m_vFileHandle.empty() )
	{
		CloseFile();
	}
	m_vFileHandle.clear();
}

FILE* CFileMerge::OpenFile(const char* szType)
{
	m_vFileHandle.clear();
	for(STR_IT it=m_vFileName.begin();it!=m_vFileName.end();it++)
	{		
		m_vFileHandle.push_back( fopen( (*it).c_str(), szType ) );
	}	
	return NULL;
}

FILE* CFileMerge::OpenFile(const int nFileNum, const char* szType)
{
	//FILE *fp = fopen( m_vFileName[nFileNum].c_str(), szType );
	//return (m_vFileHandle[nFileNum] = fp);
	return (m_vFileHandle[nFileNum] = fopen( m_vFileName[nFileNum].c_str(), szType ) );
}

void CFileMerge::CloseFile()
{
	for(FILE_IT it=m_vFileHandle.begin();it!=m_vFileHandle.end();it++)
	{
		if((*it))
		{
			fclose( (*it) );
		}
	}
}

void CFileMerge::CloseFile( const int nFileNum)
{
	if( m_vFileHandle[nFileNum] )
	{
		fclose(m_vFileHandle[nFileNum]);
	}
}

//void CFileMerge::SetFileName(STR_LIST& vFile)
void CFileMerge::SetFileName(STR_VEC& vFile, const char* szExtention )
{
	m_vFileName.clear();
	for(STR_IT it = vFile.begin(); it!=vFile.end(); it++) 
	{
		(*it) += szExtention;
		m_vFileName.push_back( (*it) );
	}
}

void CFileMerge::SetPosition( size_t pos, const int nType)
{
	for(FILE_IT it=m_vFileHandle.begin();it!=m_vFileHandle.end();it++)
	{
		fseek( (*it), pos, nType );
	}
}

void CFileMerge::Init( STR_VEC& vFile, const char* szExtention)//, const char* szType )
{	
	SetFileName( vFile, szExtention);
	m_vFileHandle.reserve( vFile.size() );
//	OpenFile( szType);
}

FILE* CFileMerge::GetFileHandle( const int nPosition )
{
	return m_vFileHandle[nPosition];
}

const char* CFileMerge::GetFileName( const int nPosition )
{
	return m_vFileName[nPosition].c_str();
}

//STR_LIST& CFileMerge::GetFileList()
STR_VEC& CFileMerge::GetFileList()
{
	return m_vFileName;
}

// CFileMerge
//////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////
// CMergeData
CMergeData::CMergeData()
{

}

//CMergeData::CMergeData(STR_LIST& vSFile, STR_LIST& vTFile, const char *szSType,const char *szTType)
CMergeData::CMergeData(STR_VEC& vSFile, STR_VEC& vTFile,const char* szSExtention, const char* szTExtention, const char *szSType,const char *szTType)
{
	Init(vSFile, vTFile, szSExtention, szTExtention);
}

CMergeData::~CMergeData()
{

}

bool CMergeData::Init( STR_VEC& vSFile, STR_VEC& vTFile, const char* szSExtention, const char* szTExtention)
{
	if( vSFile.empty() || vTFile.empty() || vSFile.size() < vTFile.size() )
	{
		return false;
	}

	m_vSource.Init( vSFile, szSExtention);
	m_vTarget.Init( vTFile, szSExtention);

	if( 0 >= m_vSource.GetSize() || 0 >= m_vTarget.GetSize() || m_vSource.GetSize() < m_vTarget.GetSize() )
	{
		return false;
	}
	return true;
}

int CMergeData::WriteTargetFile( const int nFileNum, void *buf, size_t size)
{
	FILE *fp = m_vTarget.GetFileHandle( nFileNum );
	if( NULL == m_vTarget.GetFileHandle( nFileNum ) )
	{
		m_vTarget.OpenFile( nFileNum, "wb");
	}
	return fwrite( buf, sizeof(char), size, m_vTarget.GetFileHandle( nFileNum ) );
}

int CMergeData::WriteTargetFile( const int nFileNum, FILE* fp, const int nSize )
{
	char buf[0xff];	
	int ret=0, nFullSize=0, nRead=nSize;
	while(1)
	{
		if( nRead > sizeof( buf) )
		{
			nRead = sizeof( buf);
		}

		ret = fread( buf, sizeof(char), nRead, fp);
		ret = WriteTargetFile( nFileNum, buf, ret);

		nFullSize += ret;
		if( nFullSize < nSize )
		{
			nRead = nSize - nFullSize;
			continue;
		}
		else
			break;		
	}
	return nFullSize;
}

bool CMergeData::MergeFile( const int iFlag)
{
	FILE *fp;
	if( !(fp = fopen( "tmp.bin", "wb+")))	
	{
		return false;
	}

	const int nSSize = m_vSource.GetSize();
	const int nTSize = m_vTarget.GetSize();
	if( nSSize < 0 || nTSize <0 )
	{
		return false;
	}

	//H_Data auto_ptr<hData> = new H_Data[nSSize];
	//unsigned long *hData = new unsigned long[nSSize];
	//H_Data header;
	//header.iFlag = iFlag;
	
	unsigned long arrSize[700] ={0,};//here~~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	//DWORD *arrSize = new DWORD[nSSize];
	
	char buf[2048];
	int ret = 0;
	for( int i=0; i<nSSize;i++)
	{
		if( m_vSource.OpenFile(i, "rb") )
		{
			while(1)
			{		
				if(!(ret = fread(buf, sizeof(char), 2048, m_vSource.GetFileHandle( i ) )))
					break;
				if(!(ret = fwrite(buf, sizeof(char), ret, fp )))
					break;
				//arrSize[i].dwSize += ret;
				arrSize[i] += ret;

			}
			m_vSource.CloseFile(i);
		}
	}
	
	m_vTarget.OpenFile("wb");
	//save header
	//for( i=0;i<nTSize;i++)
	//{
		//WriteTargetFile( i/(nSSize/nTSize), (void*)(&header), sizeof(H_Data) );	
	//}	
	//save size
	for( i=0;i<nSSize;i++)
	{
		WriteTargetFile( i/(nSSize/nTSize), (void*)(&arrSize[i]), sizeof(unsigned long) );	
	}
	
	//save data
	fseek( fp, 0, SEEK_SET);
	for( i=0;i<nSSize;i++)
	{
		WriteTargetFile( (i/(nSSize/nTSize)), fp, arrSize[i] ) ;		
	}
	
	fclose( fp );	
	DeleteFile("tmp.bin");
	m_vTarget.CloseFile();

	return true;
}

char* CMergeData::GetFileBuf(const int nSprite_Num, DWORD& dwDataSize)
{
	const int nFileNum = nSprite_Num /(m_vSource.GetSize()/m_vTarget.GetSize()) ;
	const int nFileSizePosition = nSprite_Num %(m_vSource.GetSize()/m_vTarget.GetSize()) ;;
	FILE *fp = m_vTarget.OpenFile( nFileNum, "rb");
	if( NULL == fp )
	{
		return NULL;
	}

	int ret=0;
	//read header
	//H_Data header;
	//if( !(ret = fread( (void*)(&header), sizeof(char), sizeof(H_Data), fp)) )
	//{
	//	return NULL;
	//}
	//庆歹俊 措茄 贸府甫 茄促. 

	//read size and position
	DWORD dwSize=0, dwPosition=0, dwPrevious=0;
	for( int i=0;i<=nFileSizePosition ;i++)
	{
		dwPrevious = dwSize;
		if( !(ret = fread( (void*)(&dwSize), sizeof(char), sizeof(unsigned long), fp)) )
		{
			break;
		}		
		dwPosition += dwPrevious;
	}
	ret = fseek( fp, 0, SEEK_SET);
	ret = fseek( fp, sizeof(unsigned long)*(m_vSource.GetSize()/m_vTarget.GetSize()), SEEK_SET);
	ret = fseek( fp, dwPosition, SEEK_CUR);

	dwDataSize = dwSize;

	char *buf =  new char[dwSize];	//唱吝俊 秦力登绢具 窍绰 皋
	fread( buf, sizeof(char), dwSize, fp );
	m_vTarget.CloseFile(nFileNum);
	return buf;
}

FILE* CMergeData::GetEffectFileHandle(const int nSprite_Num, DWORD& dwDataSize)
{
	const int nFileNum = nSprite_Num /(m_vSource.GetSize()/m_vTarget.GetSize()) ;
	const int nFileSizePosition = nSprite_Num %(m_vSource.GetSize()/m_vTarget.GetSize());	

	FILE *fp = m_vTarget.OpenFile( nFileNum, "rb");
	if( NULL == fp )
	{
		return NULL;
	}
	int ret=0;
	//read header
	//H_Data header;
	//if( !(ret = fread( (void*)(&header), sizeof(char), sizeof(H_Data), fp)) )
	//{
	//	return NULL;
	//}

	//庆歹俊 措茄 贸府甫 茄促. 
	//if( header.iFlag == )

	//read size and position
	DWORD dwSize=0, dwPosition=0, dwPrevious=0;
	for( int i=0;i<=nFileSizePosition ;i++)
	{
		dwPrevious = dwSize;
		if( !(ret = fread( (void*)(&dwSize), sizeof(char), sizeof(unsigned long), fp)) )
		{
			break;
		}		
		dwPosition += dwPrevious;
	}
	ret = fseek( fp, 0, SEEK_SET);
	ret = fseek( fp, sizeof(unsigned long)*(m_vSource.GetSize()/m_vTarget.GetSize()), SEEK_SET);
	ret = fseek( fp, dwPosition, SEEK_CUR);

	dwDataSize = dwSize;
	return fp;
}
// CMergeData
//////////////////////////////////////////////////////////////////////



⌨️ 快捷键说明

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