?? asl_file.cpp
字號:
//-----------------------------------------------------------------------------
//
// ____ Azure Star Game Engine 藍(lán)星游戲引擎 ____
//
// Copyright (c) 2006, 藍(lán)星工作室
// All rights reserved.
//
// 文件名稱: asl_file.cpp
// 摘 要: 文件類實(shí)現(xiàn)
//
// 當(dāng)前版本: 1.0
// 作 者: 湯 祺
// 創(chuàng)建日期: 2006-7-20
//
//-----------------------------------------------------------------------------
#include "asl_file.h"
#include "unzip.h"
#include <stdio.h>
namespace ASL
{
//-----------------------------------------------------------------------------
//
// ASLFile類實(shí)現(xiàn)部分
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFile::ASLFile()
// 功 能: 構(gòu)造函數(shù)
// 參 數(shù): [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);
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFile::~ASLFile()
// 功 能: 析構(gòu)函數(shù)
// 參 數(shù): [void] - 無
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
ASLFile::~ASLFile()
{
SAFE_DELETE_ARRAY(m_pBuffer);
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFile::Read()
// 功 能: 從當(dāng)前位置讀取指定字節(jié)數(shù)
// 參 數(shù): [*pBuffer] - 接收文件內(nèi)容的緩沖區(qū)指針
// [nSize] - 要讀的數(shù)據(jù)量(單位: 字節(jié))
// 返回值: [bool] - true, 如果文件未讀完
//-----------------------------------------------------------------------------
bool ASLFile::Read(void *pBuffer, int nSize)
{
if (!IsEnd())
{
memcpy(pBuffer, m_pCurrent, nSize);
m_pCurrent += nSize;
return true;
}
else
{
return false;
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFile::GetCh()
// 功 能: 從當(dāng)前位置讀取一個(gè)字符
// 參 數(shù): [&ch] - 接收讀取字符的變量
// 返回值: [bool] - true, 如果文件未讀完
//-----------------------------------------------------------------------------
bool ASLFile::GetCh(char &ch)
{
if (!IsEnd())
{
ch = *m_pCurrent++;
return true;
}
else
{
return false;
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFile::GetLine()
// 功 能: 從當(dāng)前位置讀取一行, 超過緩沖區(qū)的部分將在下次調(diào)用時(shí)讀取.
// 參 數(shù): [*pBuffer] - 接收文件內(nèi)容的緩沖區(qū)指針
// [nBufSize] - 接收緩沖區(qū)大小
// 返回值: [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類實(shí)現(xiàn)部分
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFileLoader::ASLFileLoader()
// 功 能: 構(gòu)造函數(shù)
// 參 數(shù): [void] - 無
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
ASLFileLoader::ASLFileLoader()
{
m_szDir[0] = '\0';
m_szZip[0] = '\0';
m_szPwd[0] = '\0';
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFileLoader::~ASLFileLoader()
// 功 能: 析構(gòu)函數(shù)
// 參 數(shù): [void] - 無
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
ASLFileLoader::~ASLFileLoader()
{
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFileLoader::SetZipCur()
// 功 能: 設(shè)置Zip文件(相對于當(dāng)前目錄)
// 參 數(shù): [szFileName] - 文件名
// [szPassword] - 密碼
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void ASLFileLoader::SetZipCur(LPCSTR szFileName, LPCSTR szPassword)
{
strcpy(m_szZip, szFileName);
strcpy(m_szPwd, szPassword);
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFileLoader::SetZipApp()
// 功 能: 設(shè)置Zip文件(相對于可執(zhí)行文件所在目錄)
// 參 數(shù): [szFileName] - 文件名
// [szPassword] - 密碼
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void ASLFileLoader::SetZipApp(LPCSTR szFileName, LPCSTR szPassword)
{
strcpy(m_szZip, GetAppPath());
strcat(m_szZip, szFileName);
strcpy(m_szPwd, szPassword);
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFileLoader::SetDirCur()
// 功 能: 設(shè)置文件目錄(相對于當(dāng)前目錄). 所有文件均從此目錄打開文件
// 參 數(shù): [szDirName] - 文件目錄
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void ASLFileLoader::SetDirCur(LPCSTR szDirName)
{
strcpy(m_szDir, szDirName);
if (m_szDir[0] != '\0')
{
strcat(m_szDir, "\\");
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFileLoader::SetDirApp()
// 功 能: 設(shè)置文件目錄(相對于可執(zhí)行文件所在目錄). 所有文件均從此目錄打開文件
// 參 數(shù): [szDirName] - 文件目錄
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void ASLFileLoader::SetDirApp(LPCSTR szDirName)
{
if (szDirName[0] != '\0')
{
strcpy(m_szDir, GetAbsPath(szDirName));
strcat(m_szDir, "\\");
}
else
{
strcpy(m_szDir, GetAppPath());
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: ASLFileLoader::Load()
// 功 能: 從Zip文件或指定路徑加載一個(gè)文件
// 參 數(shù): [szFileName] - 文件名
// 返回值: [ASLFile*] - 文件類對象指針
// 加載失敗拋出ASLEFailOpenFile異常
//-----------------------------------------------------------------------------
ASLFile* ASLFileLoader::Load(LPCSTR szFileName) throw(ASLFileException)
{
char szPath[MAX_PATH];
int nSize;
BYTE *pBuffer;
if (m_szZip[0] != '\0') // 從Zip文件中讀取
{
// 若文件名含有目錄結(jié)構(gòu), 則將'\\'替換成可識別的'/'
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);
}
// 將文件內(nèi)容解壓至pBuffer
nSize = ze.unc_size;
pBuffer = new BYTE[nSize+1];
UnzipItem((HZIP)hZip, index, pBuffer, nSize);
pBuffer[nSize] = 0;
// 關(guān)閉壓縮包
CloseZip(hZip);
// 創(chuàng)建并返回ASLFile對象
return new ASLFile(szFileName, pBuffer, nSize);
}
else // 從當(dāng)前路徑讀取
{
// 生成文件完整路徑
strcpy(szPath, m_szDir);
strcat(szPath, szFileName);
// 若文件名含有目錄結(jié)構(gòu), 則將'/'替換成可識別的'\\'
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);
}
// 取文件大小并分配緩沖區(qū)
fseek(fp, 0, SEEK_END);
nSize = ftell(fp);
pBuffer = new BYTE[nSize+1];
pBuffer[nSize] = 0;
// 把整個(gè)文件內(nèi)容讀入緩沖區(qū)
fseek(fp, 0, SEEK_SET);
fread(pBuffer, nSize, 1, fp);
// 關(guān)閉文件
fclose(fp);
// 創(chuàng)建并返回ASLFile對象
return new ASLFile(szFileName, pBuffer, nSize);
}
}
} // namespace ASL
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -