md_file.h
来自「MDEngine2plus游戏开发库! 用来开发游戏超级简单!」· C头文件 代码 · 共 178 行
H
178 行
//********************************************************************
// MD 引擎 数据文件 管理部件的定义
// Powered by @J--S Studio Johnhans 2004.2
//********************************************************************
#ifndef MD_FILE_H
#define MD_FILE_H
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifdef MDENGINE2P_EXPORTS
#define MDENGINE_API __declspec(dllexport)
#else
#define MDENGINE_API __declspec(dllimport)
#endif
#include "common.h"
typedef struct JSPackFileHeader // 文件头信息
{
DWORD JSPK; // 'J' 'S' 'P' 'K' 0x4B50534A
BYTE Version; // 0x01
BYTE ExInfo; // ExInfo&0x0f 外部压缩方案量*
// ExInfo&0x80 文件是否加密
WORD DirNum; // 本包中目录数量*
DWORD FileNum; // 本包中文件数量*
DWORD FOffset; // 文件信息偏移(距文件末尾位置)*
}JSPKHeader;
typedef struct JSExtendModule // 外部扩展组件信息
{
BYTE NameSize; // 组件名字大小*
char Name[255]; // 组件名字*
BYTE FNameSize; // 组件文件名大小*
char FName[255]; // 组件文件名*
DWORD Version; // 组件版本*
}JSEXModule;
typedef struct JSDirectoryInfo // 目录结构信息
{
BYTE NameSize; // 目录名域大小*
char Name[255]; // 目录名*
WORD MIN_Child; // 子目录最小ID*
WORD MAX_Child; // 子目录最大ID*
}JSDirInfo;
struct JSFileInfo // 文件结构信息
{
BYTE NameSize; // 名字域大小*
char Name[255];// 名称*
DWORD Offset; // 数据偏移(距文件起始位置)*
DWORD SizeOri; // 压缩前数据大小*
DWORD SizeCom; // 压缩后数据大小*
WORD Root; // 上级(所属) 0xFFFF:根(不属于任何级)*
BYTE Attribute;// 文件属性 0:不压缩 1:外部扩展压缩 2:内部LZW压缩*
};
struct MaskCode // 掩码表
{
BYTE b[8];
WORD w[8];
DWORD d[8];
BYTE s[16];
BYTE c[16];
};
typedef DWORD ( *getProviderTypeDLL)(void);
typedef bool ( *setFileHandleDLL)(HANDLE,char *,char *);
typedef DWORD ( *getFileSizeDLL)(void);
typedef bool ( *LocateFileDLL)(char *,char *);
typedef bool ( *ReadDLL)(LPVOID,DWORD len);
typedef char* ( *getProviderNameDLL)(void);
typedef DWORD ( *getProviderVersionDLL)(void);
typedef char* ( *getProviderInfoDLL)(void);
typedef DWORD ( *getMemNeededDLL)(DWORD);
typedef bool ( *EncodeDLL)(LPBYTE,DWORD,LPBYTE,DWORD&);
typedef bool ( *DecodeDLL)(LPBYTE,DWORD,LPBYTE);
class MDENGINE_API CMD_File
{
public:
CMD_File();
CMD_File(char *ProviderName);
virtual ~CMD_File();
public:
void EnableErrMSG(bool bshowerr); // 允许or禁止弹出错误信息
DWORD GetErrCode(void); // 得到错误代码
void EnableExt(bool bEnable); // 打开or禁用扩展搜索
void SetExt(char *path); // 设置扩展搜索路径
bool ConnectProvider(char *ProviderName); // 联接到外部FileProvider
void FreeProvider(); // 释放FileProvider
bool Open(char* FileName,bool bReadOnly=true,bool bPacked=false,char *password=NULL);
void Close();
bool Locate(char* PathName,char *password=NULL); // 定位一个文件
DWORD GetLength(); // 取得当前文件的大小
bool Read(LPBYTE *buffer=NULL,DWORD size=0); // 读取当前文件数据到引擎缓冲
bool Write(LPCVOID buffer,DWORD size); // 写入当前文件
bool Seek(long move, BYTE method=FILE_CURRENT); // 移动当前文件指针
LPVOID MappingFile(); // 取得文件映射
void UnMappingFile(); // 取消文件映射
LPBYTE GetBuffer(){ return m_lpBuffer; } // 取得文件数据缓冲
DWORD GetBufferLength(){ return m_BufferLen; }
bool WriteBufferToFile(char *PathName); // 将缓冲区数据写入文件
private:
HANDLE m_hFile; // 文件句柄
HANDLE m_hFileMap; // 文件映射句柄
LPBYTE m_pMapAddress; // 映射地址
HANDLE m_hExtra; // 打开的扩展文件句柄
bool m_bEnableExtra; // 是否允许扩展查询
char m_ExtraPath[MAX_PATH]; // 扩展目录路径
char m_FileName[MAX_PATH]; // 文件名
char m_Password[MAX_PWD]; // 文件访问密码
LPBYTE m_lpBuffer; // 数据缓冲
DWORD m_BufferLen; // 数据缓冲大小
bool m_bShowErrMSG; // 是否显示错误
DWORD m_ErrCode; // 当前错误代码
bool m_bPacked; // 文件为包
DWORD m_LocatedFileID; // 被定位的文件ID
// JSPackFile结构
JSPKHeader m_pkHeader; // 压缩文件头信息
JSEXModule *m_lppkEXModule;// 外部模块信息
JSDirInfo *m_lppkDirInfo; // 目录结构信息
JSFileInfo *m_lppkFileInfo;// 文件信息
MaskCode m_Hash;
// FileProvider部分,函数指针
HINSTANCE m_hInstProvider;
getProviderTypeDLL fp_getProviderType;
getFileSizeDLL fp_getFileSize;
setFileHandleDLL fp_setFileHandle;
LocateFileDLL fp_LocateFile;
ReadDLL fp_ReadFromPacker;
private:
// ********* 对普通文件的操作 Gen_XXXX() ******** //
bool Gen_Open(char* filename, bool readonly,HANDLE *file=NULL); // 打开文件
void Gen_Close(void); // 关闭
DWORD Gen_GetFileSize(HANDLE *file=NULL); // 取得文件大小
bool Gen_Seek(long move, BYTE method); // 移动文件指针
bool Gen_Read(LPBYTE *buffer, DWORD size,HANDLE *file=NULL); // 读取文件
bool Gen_Write(LPCVOID buffer, DWORD size,HANDLE *file=NULL); // 写入文件
// ********* 对压缩包文件的操作 Pak_XXXX() ******** //
bool Pak_Open(char* filename,char *password); // 打开文件
void Pak_Close(void); // 关闭文件
bool Pak_LocateFile(char *pathname,char *password); // 查找定位文件
DWORD Pak_GetFileSize(void); // 取得当前文件大小
bool Pak_Read(LPBYTE *buffer);
private:
void ShowErrMSG(); // 显示错误信息
bool InitPackInfo(); // 初始化压缩包目录文件信息
bool Decode(LPVOID in, unsigned in_len, LPVOID out,BYTE Attribute); // 解码数据流
bool AnalyzePath(char **start,char *res); // 分析文件路径
void SetPassword(BYTE pwd[],BYTE crc[]); // 设置访问密码
BYTE Encrypt(BYTE s,BYTE bit);
WORD Encrypt(WORD s);
DWORD Encrypt(DWORD s);
LPBYTE GetCRCByte(bool r=false);
void Encrypt(char *s,BYTE len);
void Encrypt(BYTE *s,DWORD len);
void EncryptHead(JSPackFileHeader &head);
void EncryptReset();
};
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?