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

📄 asl_file.cpp

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 CPP
字号:
//-----------------------------------------------------------------------------
//
//    ____ Azure Star Game Engine 蓝星游戏引擎 ____
//
//    Copyright (c) 2006, 蓝星工作室
//    All rights reserved.
//
//    文件名称: asl_file.cpp
//    摘    要: 文件类实现
//
//    当前版本: 1.0
//    作    者: 汤  祺
//    创建日期: 2006-7-20
//
//-----------------------------------------------------------------------------

#include "asl_file.h"
#include "unzip.h"
#include <stdio.h>

namespace ASL
{

//-----------------------------------------------------------------------------
//
// ASLFile类实现部分
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 函数名: ASLFile::ASLFile()
// 功  能: 构造函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLFile::ASLFile(LPCSTR szName, BYTE* pBuffer, int nSize, bool bDelete)
: m_pBuffer(pBuffer)
, m_nSize(nSize)
, m_pCurrent(pBuffer)
, m_bDelete(bDelete)
{
	strcpy(m_szFileName, szName);
}

//-----------------------------------------------------------------------------
// 函数名: ASLFile::~ASLFile()
// 功  能: 析构函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLFile::~ASLFile()
{
	SAFE_DELETE_ARRAY(m_pBuffer);
}

//-----------------------------------------------------------------------------
// 函数名: ASLFile::Read()
// 功  能: 从当前位置读取指定字节数
// 参  数: [*pBuffer] - 接收文件内容的缓冲区指针
//         [nSize] - 要读的数据量(单位: 字节)
// 返回值: [bool] - true, 如果文件未读完
//-----------------------------------------------------------------------------
bool ASLFile::Read(void *pBuffer, int nSize)
{	
	if (!IsEnd())
	{
		memcpy(pBuffer, m_pCurrent, nSize);
		m_pCurrent += nSize;
		return true;
	}
	else
	{
		return false;
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLFile::GetCh()
// 功  能: 从当前位置读取一个字符
// 参  数: [&ch] - 接收读取字符的变量
// 返回值: [bool] - true, 如果文件未读完
//-----------------------------------------------------------------------------
bool ASLFile::GetCh(char &ch)
{
	if (!IsEnd())
	{
		ch = *m_pCurrent++;
		return true;
	}
	else
	{
		return false;
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLFile::GetLine()
// 功  能: 从当前位置读取一行, 超过缓冲区的部分将在下次调用时读取.
// 参  数: [*pBuffer] - 接收文件内容的缓冲区指针
//         [nBufSize] - 接收缓冲区大小
// 返回值: [bool] - true, 如果文件未读完
//-----------------------------------------------------------------------------
bool ASLFile::GetLine(char *pBuffer, int nBufSize)
{
	if (!IsEnd())
	{
		int count;
		char *pos = strchr((char*)m_pCurrent, '\r');

		if (pos == NULL)
		{
			count = int((char*)m_pBuffer + m_nSize - (char*)m_pCurrent);
		}
		else
		{
			count = int(pos - (char*)m_pCurrent);
		}

		if (count >= nBufSize)
		{
			count = nBufSize - 1;
		}
		
		memcpy(pBuffer, m_pCurrent, count);
		pBuffer[count] = '\0';
			
		m_pCurrent += count;
		if (*m_pCurrent == '\r')
		{
			m_pCurrent += 2;	// 跳过 '\r' 和 '\n'
		}
		
		return true;
	}
	else
	{
		return false;
	}
}



//-----------------------------------------------------------------------------
//
// ASLFileLoader类实现部分
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 函数名: ASLFileLoader::ASLFileLoader()
// 功  能: 构造函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLFileLoader::ASLFileLoader() 
{
	m_szDir[0] = '\0';
	m_szZip[0] = '\0';
	m_szPwd[0] = '\0';
}

//-----------------------------------------------------------------------------
// 函数名: ASLFileLoader::~ASLFileLoader()
// 功  能: 析构函数
// 参  数: [void] - 无
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
ASLFileLoader::~ASLFileLoader()
{
}

//-----------------------------------------------------------------------------
// 函数名: ASLFileLoader::SetZipCur()
// 功  能: 设置Zip文件(相对于当前目录)
// 参  数: [szFileName] - 文件名
//         [szPassword] - 密码
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLFileLoader::SetZipCur(LPCSTR szFileName, LPCSTR szPassword)
{
	strcpy(m_szZip, szFileName);
	strcpy(m_szPwd, szPassword);
}

//-----------------------------------------------------------------------------
// 函数名: ASLFileLoader::SetZipApp()
// 功  能: 设置Zip文件(相对于可执行文件所在目录)
// 参  数: [szFileName] - 文件名
//         [szPassword] - 密码
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLFileLoader::SetZipApp(LPCSTR szFileName, LPCSTR szPassword)
{
	strcpy(m_szZip, GetAppPath());
	strcat(m_szZip, szFileName);
	strcpy(m_szPwd, szPassword);
}

//-----------------------------------------------------------------------------
// 函数名: ASLFileLoader::SetDirCur()
// 功  能: 设置文件目录(相对于当前目录). 所有文件均从此目录打开文件
// 参  数: [szDirName] - 文件目录
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLFileLoader::SetDirCur(LPCSTR szDirName)
{
	strcpy(m_szDir, szDirName);
	if (m_szDir[0] != '\0')
	{
		strcat(m_szDir, "\\");
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLFileLoader::SetDirApp()
// 功  能: 设置文件目录(相对于可执行文件所在目录). 所有文件均从此目录打开文件
// 参  数: [szDirName] - 文件目录
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLFileLoader::SetDirApp(LPCSTR szDirName)
{
	if (szDirName[0] != '\0')
	{
		strcpy(m_szDir, GetAbsPath(szDirName));
		strcat(m_szDir, "\\");
	}
	else
	{
		strcpy(m_szDir, GetAppPath());
	}
}

//-----------------------------------------------------------------------------
// 函数名: ASLFileLoader::Load()
// 功  能: 从Zip文件或指定路径加载一个文件
// 参  数: [szFileName] - 文件名
// 返回值: [ASLFile*] - 文件类对象指针
//         加载失败抛出ASLEFailOpenFile异常
//-----------------------------------------------------------------------------
ASLFile* ASLFileLoader::Load(LPCSTR szFileName) throw(ASLFileException)
{
	char szPath[MAX_PATH];
	int  nSize;
	BYTE *pBuffer;

	if (m_szZip[0] != '\0')	// 从Zip文件中读取
	{
		// 若文件名含有目录结构, 则将'\\'替换成可识别的'/'
		strcpy(szPath, szFileName);
		for (int i = 0; i < (int)strlen(szPath); ++i)
		{
			if (szPath[i] == '\\')
			{
				szPath[i] = '/';
			}
		}
		
		// 打开压缩包
		HZIP hZip = OpenZip(m_szZip, m_szPwd);
		if (hZip == 0)
		{
			throw ASLFileException(m_szZip, ASLFileException::OpenFailed);
		}

		// 在Zip包中查找指定文件
		ZIPENTRY ze;
		int index;
		FindZipItem(hZip, szPath, true, &index, &ze);
		if (index == -1)
		{
			throw ASLFileException(szFileName, ASLFileException::OpenFailed);
		}

		// 将文件内容解压至pBuffer
		nSize = ze.unc_size;
		pBuffer = new BYTE[nSize+1];
		UnzipItem((HZIP)hZip, index, pBuffer, nSize);
		pBuffer[nSize] = 0;

		// 关闭压缩包
		CloseZip(hZip);

		// 创建并返回ASLFile对象
		return new ASLFile(szFileName, pBuffer, nSize);
	}
	else	// 从当前路径读取
	{
		// 生成文件完整路径
		strcpy(szPath, m_szDir);
		strcat(szPath, szFileName);

		// 若文件名含有目录结构, 则将'/'替换成可识别的'\\'
		for (int i = 0; i < (int)strlen(szPath); ++i)
		{
			if (szPath[i] == '/')
			{
				szPath[i] = '\\';
			}
		}

		// 打开文件
		FILE *fp = fopen(szPath, "rb");
		if (fp == NULL)
		{
			throw ASLFileException(szFileName, ASLFileException::OpenFailed);
		}

		// 取文件大小并分配缓冲区
		fseek(fp, 0, SEEK_END);
		nSize = ftell(fp);
		pBuffer = new BYTE[nSize+1];
		pBuffer[nSize] = 0;

		// 把整个文件内容读入缓冲区
		fseek(fp, 0, SEEK_SET);
		fread(pBuffer, nSize, 1, fp);

		// 关闭文件
		fclose(fp);

		// 创建并返回ASLFile对象
		return new ASLFile(szFileName, pBuffer, nSize);
	}
}


} // namespace ASL

⌨️ 快捷键说明

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