/**************************************************************************** * FileName : DSFileSystem.h * * Programmer : AAAwen * * Writen at : 2005.05.10 * * Version : 1.0 * * Description: define filesystem of flash * * Last modify: 2005.05.10 * ****************************************************************************/ #ifndef __DSFILESYSTEM_H_ICL__ #define __DSFILESYSTEM_H_ICL__ #include "basetype.h" #include //typedef char* HDSFILE; /*! 清除数据流已经被读取的字节数 */ #define SEEK_CLR_RCNT SEEK_END+10 #define SEEK_CUR_EX SEEK_END+11 // 修改DS中的配置文件系统 #define DS_FILESYSTEM_ADDR 0x3b0000 #define DS_FILESYSTEM_LEN (0x50000-4) #define DS_SECTION_OUT -1 // 段名称长度越限 #define DS_SECTION_NOEXIST 0 // 段名称不存在 #define DS_SECTION_EXIST 1 // 段名称存在 #define DS_SECTION_SEARCH 2 // 段名称查找 typedef struct tsgDSFILE { /*! 文件内容长度 */ long m_lContentLen; /*! 文件读取的当前位置 */ long m_lOffset; /*! 文件读取的字节数量 */ long m_lReadCount; // 增加优化配置文件读取项 /*! 段名称是否存在 */ long m_lSectionOk; /*! 段名称行数 */ long m_lSectionLines; /*! 段名称行数增加标识 */ long m_lSectionLinesAddFlag; /*! 段在文件中的偏移位置 */ long m_lSectionOffset; /*! 段名称 */ char m_szSection[64]; /*! 文件正文 */ char *m_pContent; }DSFILE, *HDSFILE; #ifdef OS_WINDOWS #pragma pack (push,1) typedef struct tagDSFILESYSTEMHEAD { /*! 文件系统中文件数量 */ int m_iFiles; /*! 文件系统中首文件偏移 \note 第一个文件=this+m_iOffset */ int m_iOffset; }DSFILESYSTEMHEAD; typedef struct tagDSFILEHEAD { /*! 文件长度(文件内容+文件头) */ int m_iFileSize; /*! 文件内容偏移 */ int m_iOffset; /*! 文件名长度 */ int m_iFileNameLen; /*! 文件名称 */ char m_FileName[1]; }DSFILEHEAD, *pDSFILEHEAD; typedef struct tagFILECONTENT { long m_lContentLen; long m_lOffset; char m_pContent[1]; }FILECONTENT, *pFILECONTENT; #pragma pack (pop) #else typedef struct tagDSFILESYSTEMHEAD { /*! 文件系统中文件数量 */ int m_iFiles ; /*! 文件系统中首文件偏移 \note 第一个文件=this+m_iOffset */ int m_iOffset ; }DSFILESYSTEMHEAD; typedef struct tagDSFILEHEAD { /*! 文件长度(文件内容+文件头) */ int m_iFileSize ; /*! 文件内容偏移 */ int m_iOffset ; /*! 文件名长度 */ int m_iFileNameLen ; /*! 文件名称 */ char m_FileName[1] ; }DSFILEHEAD, *pDSFILEHEAD; typedef struct tagFILECONTENT { long m_lContentLen ; long m_lOffset ; char m_pContent[1] ; }FILECONTENT, *pFILECONTENT; #endif /*! \brief 将指定文件载入目的内存 \param szFileName -- 要载入的文件名 \param ppDestMem -- 目的内存指针的指针 \retval -- 返回分配内存长度 \note 如果内存分配失败或者文件为空返回0\n pDestMem必须在使用后有调用者释放 */ long LoadFile(const char *szFileName, char **ppDestMem); /*! \brief 将指定文件载入目的内存 \param szFileName -- 要载入的文件名 \param ppDestMem -- 目的内存指针的指针 \param pFSAddr -- 文件系统首地址指针 \retval -- 返回分配内存长度 \note 如果内存分配失败或者文件为空返回0\n pDestMem必须在使用后有调用者释放 */ long LoadFileInDSFS(const char *szFileName, char **ppDestMem, BYTE *pFSAddr); /*! \brief 设置数据流偏移量 \param stream -- 数据流指针 \param offset -- 与origin的偏移值 \param origin -- 初始位置 \retval -- 成功返回0 */ DSLIB_API int DS_Seek(FILECONTENT *stream, long offset, int origin); DSLIB_API char *DS_Gets(char *pDest, int iDestMax, FILECONTENT *stream); /*! \brief 获取文件长度 \param fp -- 已经打开的文件指针 \retval -- 返回文件长度 */ DSLIB_API int GetFileLen(FILE *fp); /*! \brief 将指定文件载入目的内存 \param szFileName -- 要载入的文件名 \retval -- 返回文件句柄 \note 如果内存分配失败或者文件为空返回0\n pDestMem必须在使用后有调用者释放 */ DSLIB_API HDSFILE DSOpenFile(const char *szFileName); DSLIB_API HDSFILE DSOpenFileEx(const char *szFileName); /*! \brief 将指定文件载入目的内存 \param szRootDir -- 文件系统的根路径 \param szFileName -- 要载入的文件名 \retval -- 返回文件句柄 \note 如果内存分配失败或者文件为空返回0\n pDestMem必须在使用后有调用者释放 该函数仅适合于pc系统,用来浏览文件系统信息 在嵌入式系统中,参数1无意义 */ DSLIB_API HDSFILE DSOpenFileEx3(const char *szRootDir, const char *szFileName); DSLIB_API HDSFILE DSOpenFileEx2(const char *szRootDir, const char *szFSName, const char *szFileName); /*! \brief 关闭打开的文件 \param hFile -- 打开的文件句柄 \note 如果内存分配失败或者文件为空返回0\n pDestMem必须在使用后有调用者释放 */ DSLIB_API BOOL DSCloseFile(HDSFILE hFile); /*! \brief 从数据流中获取数据 \param buffer -- 获取数据缓冲区指针 \param size -- 获取数据单元的长度 \param count -- 获取数据单元的数量 \param hFile -- 数据流指针 \retval -- 成功返回实际的读取数据单元数量 */ DSLIB_API size_t DSfread(void *buffer, size_t size, size_t count, HDSFILE hFile); /*! \brief 获取数据流一个字符串(以回车和换行结束) \param string -- 获取字符串的缓冲区指针 \param origin -- 缓冲区长度 \param hFile -- 数据流指针 \retval -- 成功返回读取的字符串指针 */ DSLIB_API char *DSfgets(char *string, int iMaxSize, HDSFILE hFile); /*! \brief 获取数据流一个字符串(以回车和换行结束) \param string -- 获取字符串的缓冲区指针 \param origin -- 缓冲区长度 \param hFile -- 数据流指针 \param ioffset -- 当前位置读取偏移 \retval -- 成功返回读取的字符串指针 \note 读取指针不移动,需要用户干预 */ DSLIB_API char *DSfgetsEx(char *string, int iMaxSize, HDSFILE hFile); /*! \brief 读取文件已经读取的数据量 \param hFile -- 数据流指针 \retval -- 实际读取的数据量 */ DSLIB_API int DSfgetreadcount(HDSFILE hFile); /*! \brief 设置数据流偏移量 \param hFile -- 数据流指针 \param offset -- 与origin的偏移值 \param origin -- 初始位置 \retval -- 成功返回0 */ DSLIB_API int DSfseek(HDSFILE hFile, long offset, int origin); /*! \brief 是否到数据流底部 \param hFile -- 数据流指针 \retval -- 成功返回0 */ DSLIB_API int DSfeof(HDSFILE hFile); /*! \brief 是否到数据流底部 \param hFile -- 数据流指针 \retval -- 成功返回0 */ DSLIB_API int DSfeofEx(HDSFILE hFile); /*! \brief 是否数据流全部浏览完毕 \param hFile -- 数据流指针 \retval -- 成功返回0,否则为浏览过的字节数 */ DSLIB_API int DSfeob(HDSFILE hFile); /*! \brief 数据流的偏移量 \param hFile -- 数据流指针 \retval -- 返回偏移量 */ DSLIB_API int DSftell(HDSFILE hFile); DSLIB_API int DSHaveSection(char *pSection, HDSFILE hFile); DSLIB_API int DSSaveSectionOffset(HDSFILE hFile); DSLIB_API int DSRestoreSectionOffset(HDSFILE hFile); DSLIB_API int DSAddSectionLines(int iLines, HDSFILE hFile); DSLIB_API int DSSubSectionLines(int iLines, HDSFILE hFile); DSLIB_API int DSSetSectionLinesAddFlag(int iFlag, HDSFILE hFile); DSLIB_API int DSSectionisOver(int iReadLines, HDSFILE hFile); /*! \brief 合并所有文件 \param szListFileName -- 要合并的文件列表文件名称 \param szDestFileName -- 合并的目的文件 \param szDestDir -- 文件路径 \retval -- 成功返回TRUE \note 合并后的文件必须是偶字节对齐 */ DSLIB_API BOOL FsCombinAllFile(const char *szListFileName, const char *szDestFileName, const char *szDestDir); /*! \brief 文件分离 \param szCombinFile -- 合并的文件名称 \param szDestDir -- 要分离的文件目录 \retval -- 成功返回TRUE */ DSLIB_API BOOL FsSplitAllFile(const char *szCombinFile, const char *szDestDir); //测试用 /*! \brief 读取合并的文件(文件系统) \param szCombinFile -- 合并的文件名称 \retval -- 成功返回TRUE */ DSLIB_API BYTE *FsReadCombinFile(const char *szCombinFile); DSLIB_API BYTE *FsReadCombinFileEx(const char *szCombinFile); /*! \brief 装载文件系统 \param szFileSystem -- 文件系统名称 \param ppDestBuf -- 文件系统的目的缓冲区 \retval -- 成功返回TRUE */ DSLIB_API BOOL FsLoadFileSystem(const char *szFileSystem, BYTE **ppDestBuf); /*! \brief 卸载文件系统 \param ppDestBuf -- 文件系统的目的缓冲区 \retval -- 成功返回TRUE */ DSLIB_API BOOL FsUnLoadFileSystem(BYTE **ppDestBuf); /*! \brief 显示指定文件系统路径的文件名称 \param szPath -- 要显示的文件系统路径 \param szFileSystem -- 指定的文件系统 \retval -- 成功返回TRUE */ DSLIB_API BOOL FsDirFileName(const char *szPath, const char *szFileSystem); DSLIB_API void FsDispHead(const char *szName, const char *szFileSystem); BOOL FsNetToHost(BYTE *pFSBuf); BOOL FsHostToNet(BYTE *pFSBuf); void DispMemoryData(const BYTE *pu8Addr, int iLen, int iNumofLine); #endif