📄 asl_file.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 + -