/** @file PackageFileSystem.h @brief 文件打包:包文件系统 第一版测试
*	Copyright (c) 2007,北京金刚游科技有限公司
*	All rights reserved.
*
*	当前版本:2008-08-20 
*	作    者:KingKong
*	完成日期:2008-08-
*
*	取代版本:
*	作    者:
*	完成日期:
*/ #if !defined _PACKAGFILESYSTEM_H_ #define _PACKAGFILESYSTEM_H_ #include "Api.h" #pragma warning(push) #pragma warning( disable: 4251 ) class PACKAGE_ENTRY CPackageFileSystem: public CRefObject { public: CPackageFileSystem(bool bModified = false); ~CPackageFileSystem(); //////////////////////////////////////////////////////////////////////////////// //函数名:CPackageFileSystem 拷贝构造函数 //功能:拷贝构造一个文件系统信息 //入口参数: CPackageFileSystem* kSrcSystem 源文件信息系统 //出口参数: 无 //说明: //////////////////////////////////////////////////////////////////////////////// CPackageFileSystem( CPackageFileSystem* kSrcSystem ); //////////////////////////////////////////////////////////////////////////////// //函数名:CloneFrom函数 //功能:拷贝构造一个文件系统信息 //入口参数: CPackageFileSystem* kSrcSystem 源文件信息系统 //出口参数: 无 //说明: //////////////////////////////////////////////////////////////////////////////// void CloneFrom( CPackageFileSystem* kSrcSystem ); //////////////////////////////////////////////////////////////////////////////// //函数名:LoadPackFileSystem //功能:从包文件载入包系统信息 //入口参数: FILE* pPackFile 包文件 // UINT nSystemInfoPos 文件系统信息存储位置 // bool bModified 当前系统模式 //出口参数: bool 成功返回true, 失败返回 false //说明: //////////////////////////////////////////////////////////////////////////////// bool LoadPackFileSystem( FILE* pPackFile, UINT nSystemInfoPos, bool bModified ); //////////////////////////////////////////////////////////////////////////////// //函数名:SavePackFileSystemInfo //功能:向包文件写入包系统信息 //入口参数: FILE* pPackFile 包文件 // UINT nPos 文件系统信息存储位置 //出口参数: UINT 文件系统信息在包文件中的最后写入位置 //说明: //////////////////////////////////////////////////////////////////////////////// UINT SavePackFileSystemInfo( FILE* pPackFile,UINT nPos,FILETIME nContentVersion ); //////////////////////////////////////////////////////////////////////////////// //函数名:GetPackFileInfo //功能:获得指定文件的文件描述信息 //入口参数: string szPathName 文件全路径(相对路径+文件名) //出口参数: SPackageFileInfo* 文件信息描述指针,如果未找到则返回NULL //说明: //////////////////////////////////////////////////////////////////////////////// SPackageFileInfo* GetPackFileInfo( string szPathName ); //////////////////////////////////////////////////////////////////////////////// //函数名:GetPackDirInfo //功能:获得指定文件的文件描述信息 //入口参数: string szPathName 文件全路径(相对路径+文件名) //出口参数: SPackageFileInfo* 文件信息描述指针,如果未找到则返回NULL //说明: //////////////////////////////////////////////////////////////////////////////// SPackageDirInfo* GetPackDirInfo( string szPathName ); //////////////////////////////////////////////////////////////////////////////// //函数名:SetPackageRootDir //功能:设置包的根目录 //入口参数: string strRootDir 根目录 //出口参数: bool //说明: //////////////////////////////////////////////////////////////////////////////// bool SetPackageRootDir( string strRootDir) ; //////////////////////////////////////////////////////////////////////////////// //函数名:GetPackageRootDir //功能:返回包根目录路径 //入口参数: 无 //出口参数: string 根目录路径 //说明: //////////////////////////////////////////////////////////////////////////////// string GetPackageRootDir() const { return m_rootDir.szDirName; }; //////////////////////////////////////////////////////////////////////////////// //函数名:GetPackageDataEndPos //功能: 获得包数据区最后写入位置 //入口参数: 无 //出口参数: UINT 位置 //说明: //////////////////////////////////////////////////////////////////////////////// UINT GetPackageDataEndPos() const { return m_sSystemInfo.nFileInfoPos; }; //////////////////////////////////////////////////////////////////////////////// //函数名:AddFileInfo //功能:添加指定文件描述到包文件描述系统 //入口参数: string szPathName 文件全路径 // const SPackageFileInfo& fileInfo 源文件描述信息 //出口参数: bool 成功返回true, 失败返回 false //说明: //////////////////////////////////////////////////////////////////////////////// bool AddFileInfo( string szPathName, const SPackageFileInfo& fileInfo ); //////////////////////////////////////////////////////////////////////////////// //函数名:DeleteFileInfo //功能:删除指定文件描述 //入口参数: string szPathName 文件全路径 //出口参数: bool //说明: //////////////////////////////////////////////////////////////////////////////// bool DeleteFileInfo( string szPathName ); //////////////////////////////////////////////////////////////////////////////// //函数名:GetIdleSpace //功能:获得大于等于指定大小的碎片空间 //入口参数: UINT nSize 空间大小 // SPackageIdleSpaceInfo& sIdleInfo 碎片空间信息的引用 // bool bUse 是否使用改碎片空间,ture 则在返回碎片空间的同时删除该空间,反之仅返回该空间 //出口参数: bool 找到返回 ture,反之返回 false //说明:找到则由sIfleInfo返回找到的碎片空间信息 //////////////////////////////////////////////////////////////////////////////// bool GetIdleSpace( UINT nSize,SPackageIdleSpaceInfo& sIdleInfo, bool bUse ); //////////////////////////////////////////////////////////////////////////////// //函数名:Deflate //功能:紧凑模式 //入口参数: FILE* pPackFile 源包文件流指针 //出口参数: //说明:bool 成功返回true, 失败返回 false //////////////////////////////////////////////////////////////////////////////// bool Deflate( FILE* pPackFile ); //////////////////////////////////////////////////////////////////////////////// //函数名:FindAllFileInfos //功能:由当前文件系统和比对文件系统对比,查找是否相同 //入口参数: vector& vFilesName 当前文件系统所有文件 //出口参数: bool 成功返回true, 失败返回 false //说明: //////////////////////////////////////////////////////////////////////////////// bool FindAllFilesName(vector& vFilesName); void GetAllFilesInfo(vector& vFileInfos); //////////////////////////////////////////////////////////////////////////////// //函数名:GetRelPath //功能:获得相对路径 //入口参数: string strAbsPath 源路径 //出口参数: string 相对路径 //说明: //////////////////////////////////////////////////////////////////////////////// string GetRelPath( string strAbsPath ); protected: private: CPackageFileSystem(CPackageFileSystem&); //////////////////////////////////////////////////////////////////////////////// //函数名:WriteSystemInfoToPackage //功能:将包系统信息写入指定文件 //入口参数: FILE* pFile 目标文件流指针 // SFileSystemInfo& sSystemInfo 源包系统信息 // UINT nPos 写入位置 //出口参数: UINT 写入文件的最后位置 //////////////////////////////////////////////////////////////////////////////// UINT _WriteSystemInfoToPackage( FILE* pFile, SFileSystemInfo& sSystemInfo, UINT nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:ReadSystemInfoFromPackage //功能:从指定文件读取包系统信息 //入口参数: FILE* pFile 源文件流指针 // SFileSystemInfo& sSystemInfo 目标包系统信息 // UINT nPos 读入位置 返回读入最后位置 //出口参数: bool 成功返回ture 失败返回 false //////////////////////////////////////////////////////////////////////////////// bool _ReadSystemInfoFromPackage( FILE* pFile, SFileSystemInfo& sSystemInfo, UINT& nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:WriteFileInfoToPackage //功能:将文件信息写入指定文件 //入口参数: FILE* pFile 目标文件流指针 // SPackageFileInfo& sFileInfo 源包文件信息 // UINT nPos 写入位置 //出口参数: UINT 写入文件的最后位置 //////////////////////////////////////////////////////////////////////////////// UINT _WriteFileInfoToPackage( FILE* pFile, SPackageFileInfo& sFileInfo, UINT nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:ReadFileInfoFromPackage //功能:从指定文件读取文件信息 //入口参数: FILE* pFile 源文件流指针 // SPackageFileInfo& sFileInfo 目标文件信息 // UINT nPos 读入位置 返回读入最后位置 //出口参数: bool 成功返回ture 失败返回 false //////////////////////////////////////////////////////////////////////////////// bool _ReadFileInfoFromPackage( FILE* pFile, SPackageFileInfo& sFileInfo, UINT& nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:_CreateDirInfo //功能:创建目录信息 //入口参数: string strDirName 源目录路径 //出口参数: SPackageDirInfo* 目录信息指针 //说明: //////////////////////////////////////////////////////////////////////////////// SPackageDirInfo* _CreateDirInfo( string strDirName ); //////////////////////////////////////////////////////////////////////////////// //函数名:_SaveSystemInfoToPackage //功能:写入包系统信息到包文件 //入口参数: FILE* pPackFile 包文件流指针 // UINT nPos 写入位置 //出口参数: 最终写入位置 //说明: //////////////////////////////////////////////////////////////////////////////// UINT _SaveSystemInfoToPackage( FILE* pPackFile,UINT nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:_SaveFileInfoToPackage //功能:写入文件描述信息到包文件 //入口参数: FILE* pPackFile 包文件流指针 // UINT nPos 写入位置 //出口参数: 最终写入位置 //说明: //////////////////////////////////////////////////////////////////////////////// UINT _SaveFileInfoToPackage( FILE* pPackFile,UINT nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:_SaveFileIdleSpaceInfoToPackage //功能:写入碎片空间信息到包文件 //入口参数: FILE* pPackFile 包文件流指针 // UINT nPos 写入位置 //出口参数: 最终写入位置 //说明: //////////////////////////////////////////////////////////////////////////////// UINT _SaveFileIdleSpaceInfoToPackage( FILE* pPackFile,UINT nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:_InsertAllFileInfoToVector //功能: 将包系统中的所有文件信息插入一个容器中 //入口参数: vector& vPackageFileInfos 目标容器 //出口参数: 无 //说明: //////////////////////////////////////////////////////////////////////////////// void _InsertAllFileInfoToVector( vector& vPackageFileInfos ); //////////////////////////////////////////////////////////////////////////////// //函数名:_InsertDirInfoToVector //功能:将指定目录信息中的所有文件信息插入目标容器 //入口参数: vector& vPackageFileInfos 目标容器 // SPackageDirInfo& sDirInfo 源目录信息 //出口参数: 无 //说明: //////////////////////////////////////////////////////////////////////////////// void _InsertDirInfoToVector( vector& vPackageFileInfos, SPackageDirInfo& sDirInfo ); //////////////////////////////////////////////////////////////////////////////// //函数名:_LoadSystemInfo //功能:载入包系统信息 //入口参数: FILE* pPackFile 包文件流指针 // UINT nPos 系统信息在包中的存储位置 //出口参数: //说明: //////////////////////////////////////////////////////////////////////////////// bool _LoadSystemInfo( FILE* pPackFile,UINT nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:_LoadFileInfos //功能:载入文件信息描述 //入口参数: FILE* pPackFile 包文件流指针 // UINT nPos 信息在包中的存储位置 //出口参数: bool 成功返回ture,失败返回false //说明: //////////////////////////////////////////////////////////////////////////////// bool _LoadFileInfos( FILE* pPackFile,UINT nFileInfoPos); //////////////////////////////////////////////////////////////////////////////// //函数名:_LoadIdleInfo //功能:载入碎片空间 //入口参数: FILE* pPackFile 包文件流指针 // UINT nPos 信息在包中的存储位置 //出口参数: bool 成功返回ture,失败返回false //说明: //////////////////////////////////////////////////////////////////////////////// bool _LoadIdleInfo( FILE* pPackFile,UINT nPos ); //////////////////////////////////////////////////////////////////////////////// //函数名:_MoveFileData //功能: 移动包数据,用于紧缩模式 //入口参数: FILE* pPackFile 包文件流 // SPackageFileInfo sFileInfo 当前移动数据的文件描述信息 // UINT nMoveOffset 向上移动的偏移量 //出口参数: bool 成功返回ture,失败返回false //说明: //////////////////////////////////////////////////////////////////////////////// bool _MoveFileData( FILE* pPackFile, SPackageFileInfo sFileInfo, UINT nMoveOffset ); //////////////////////////////////////////////////////////////////////////////// //函数名:_GetPackDirInfo //功能:获得指定路径的目录描述信息 //入口参数: string szPathName 相对于root的路径 //出口参数: SPackageDirInfo* 目录信息指针,如果未找到则返回NULL //说明: //////////////////////////////////////////////////////////////////////////////// SPackageDirInfo* _GetPackDirInfo( string szPathName ); size_t _Encoderfwrite( const void *buffer, size_t size, size_t count,FILE *stream ); size_t _Decoderfread( void *buffer, size_t size, size_t count,FILE *stream ); //---------------------------------------------------------------------------------------------------------------- // 成员变量 SPackageDirInfo m_rootDir; // 文件系统根 bool m_bModified; // 当前系统是否可改写 // 用于记录有空闲空间的文件结构位置 vector m_vIdleSpace; SFileSystemInfo m_sSystemInfo; // 包系统信息统计 }; //导出函数 PACKAGE_ENTRY string GetPackageRootDir(); SmartPointerDef( CPackageFileSystem ); #pragma warning(pop) #endif //end of _PACKAGFILESYSTEM_H_