BREW提供了一个EFS接口,可以用于文件和目录管理及读写操作。
IFileMgr接口
IfileMgr接口函数用于创建、删除、重命名文件/目录。将提供了获取文件和目录信息的方法。能过指定Class ID为AEECLSID_FILEMGR调用ISHELL_CreateInstance()来得到一个指向IfileMgr接口的指针,IfileMgr指针可以用来访问应用程序目录下的文件。BREW AEE同样也提供了一个可以允许多个应用程序访问的共享目录。共享目当由AEE.h中宏AEE_SHARED_DIR定义(实际的文件名由设备制造商来指定)。
BREW AEE中文件名称是不区分大小写的,这意味着当使用IfileMgr或其它文件相关API时,它将使用小写字母为文件名。例如:以Foo.bar调用IFILEMGR_OpenFile(),文件将以foo.bar打开。
BREW支持的最长设备文件名长度由AEE_MAX_FILE_NAME指明,为64。
注:应用程序必需具有PL_FILE或PL_SYSTEM才能打开和创建文件和目录,必需具有PL_SHARD_WRITE或PL_SYSTEM才能对共享目录进行操作。
可以能过IFILEMGR_EnumInit()和 IFILEMGR_EnumNext()对某一目录进行枚举操作以得到该目录下所有的文件和目录。可以对所有指定扩展名的文件进行枚举操作,首先调用IFILEMGR_EnumInit()指明需要进行枚举操作的目录,每个后续的IFILEMGR_EnumNext()给出一个需要枚举的文件或目录的名称、大小、创建日期和属性。当该目录所有的文件和目录都遍历后IFILEMGR_EnumNext()返回FALSE。指明文件名通过调用IFILEMGR_GetInfo() 可以获得同样的文件信息。IFILEMGR_GetFreeSpace()函数返回设备文件系统中空闲空间字节大小。. IFILEMGR_GetLastError()返回上次错误代码。. IFILEMGR_Test()可以用来检测指定的文件或目录是否存在。
IFILEMGR_MkDir()创建一个目录。
IFILEMGR_RmDir()删除一个目当,在删除一个目录之前,必需删除该目录下所有文件及子目录。
IFILEMGR_OpenFile()创建一个新文件或者是打开一个现存的文件用于读或写操作。文件用相对于应用程序目录的文件名称来指定。IFILEMGR_OpenFile()返回一个指向打开的文件的Ifile接口指针,调用IFILEMGR_Release()来关闭一个打开的文件,. IFILEMGR_Rename() 重命名一个文件, IFILEMGR_Remove()删除一个文件,只有当文件关闭时才能被删除和重命名。如果文件被打开不止一次,每一个打开操作必需有与之对应的关闭操作,删除及重命名才能成功。
IfileMgr接口使用步骤
调用ISHELL_CreateInstance()创建一个IfileMgr接口指针。
调用上述的函数来取得应用程序目录下文件信息或取得当前文件系统空闲空间大小。
调用IFILEMGR_MkDir() 和 IFILEMGR_RmDir()来创建和删除一个目录。调用IFILEMGR_OpenFile(), IFILEMGR_Rename(), 和 IFILEMGR_Remove()打开、重命名或删除一个文件。
读取或修改文件内容
调用IFILEMGR_OpenFile()打开一个文件用于读或写。
调用 IFile 接口函数来修改文件内容。
当完成文件操作时调用IFILE_Release()来关闭文件。
不需使用IfileMgr时调用IFILEMGR_Release()关闭File Manager。
IAStream接口
IAStream从一个异步流中读取数据,该接口为一个抽象接口,实现该接口的类提供了一个当前可能还没有准备好需要进行异步操作的数据访问,当前Ifile和Isocket接口实现了Istream 接口定义,IImage和IsoundPlayer接口提供了IIMAGE_SetStream() 和 ISOUNDPLAYER_SetStream()函数指定某个Istream接口类作为Image和Sound的源。
IASTREAM_Read()从一个流中读取数据并返回读取的字节个数,如果当前没有可用于读取的数据,该函数将返回AEE_STREAM_WOULDBLOCK。在后一种情形下,调用IASTREAM_Readable()当有数据可读时调用一个回调函数。IASTREAM_Cancel()取消由IASTREAM_Readable()设置的回调函数。
使用IAStream接口异步读取数据
- 调用ISHELL_CreateInstance()创建一个实现了Iastream接口的类指针。
- 调用ASTREAM_Read()读取指定数量的数据,因为IAStream为一抽象接口,调用Ifile_Read来读文件,或ISOCKET_Read()来从一个Socket 中读取数据。
- 如果IASTREAM_Read()返回AEE_STREAM_WOULDBLOCK,调用IASTREAM_Readable()指明一个回调函数,
- 如果 IASTREAM_Read()返回的字节数比预计的要小,重复调用该函数以取得余下的数据。
- 重复2-4直至读取了所有的数据
IFile 接口
IFile接口提供了读取和修改文件内容的函数集合。通过调用IFILEMGR_OpenFile()来取指向某个文件的Ifile接口指针,再通过该指针调用Ifile接口函数。当完成对文件的操作后,调用IFILE_Release()来关闭该文件。
IFILE_GetInfo()返回打开文件的名称、大小、创建日期。如果文件未打开,通过调用IFILEMGR_GetInfo()可以获取同样的文件信息。
IFILE_Read()从文件中读取指定长度的数据到应用程序变量中。
IFILE_Write()将指定长度的数据写到文件中。所有的读写操作都是相对于当前文件指针而言的。文件打开时,文件指针指向文件头第一个字节(除非是以Append方式打开,此时文件指针为文件尾)。每个读写操作都将文件指针移到读或写的最后字节的下一个字符位置。通过IFILE_Seek()可以将文件指针移到特定的位置。
IFILE_Truncate()允许重新减小文件长度,它将抛弃截断位置后面的文件内容。
读写文件的三种读取方式
通过BREW提供的上述接口,可以以三种方式读取一个文件,一次性读取、按逻辑行读取,一次读取固定长度的字符串,分次读完文件。
一次性读取整个文件
该方法适用于文件比较小。
| extern void MM_UI_FILEEDIT_ReadFile(IWindow * po,char *pFileName) |
| { |
| IFileMgr * pIFileMgr; |
| int nErr; |
| FileInfo fileInfo; |
| MM_UI_FILEEDIT_T * pThis = (MM_UI_FILEEDIT_T *)po; |
| MM_APPLET_INFO_T *pOwner=pThis->m_pOwner; |
| char* pzFileNameBuf = NULL; |
| IFile *pIFile; |
| AECHAR szFileName[]={‘o’,'p’,'e’,'r’,'a’,'t’,'i’,'o’,'n’,’.’,'t’,'x’,'t’, ‘\0′}; |
| AECHAR *pFileContent=NULL; |
| char* pszLine; |
| int nRet; |
| ITEXTCTL_SetProperties(pThis->m_pStatic,TP_MULTILINE); |
| ISHELL_CreateInstance(pThis->m_pIShell,AEECLSID_FILEMGR,(void **)&pIFileMgr); |
| pzFileNameBuf=(char *)MALLOC(64); |
| STRCPY(pzFileNameBuf, AEE_SHARED_DIR); |
| STRCAT(pzFileNameBuf, “/operation.txt”); |
| pIFile=IFILEMGR_OpenFile(pIFileMgr,pzFileNameBuf,_OFM_READ); |
| if(pIFile) |
| { |
| IFILE_GetInfo(pIFile,&fileInfo); |
| pFileContent=(AECHAR *)MALLOC((fileInfo.dwSize+2)*sizeof(AECHAR)); |
| pszLine=(char *)MALLOC((fileInfo.dwSize+1)*sizeof(char)); |
| ZEROAT(pFileContent); |
| ZEROAT(pszLine); |
| nRet=IFILE_Read(pIFile,pszLine,fileInfo.dwSize+1); |
| STRTOWSTR(pszLine,pFileContent,(fileInfo.dwSize+2)*sizeof(AECHAR)); |
| ITEXTCTL_SetMaxSize(pThis->m_pStatic, (uint16)fileInfo.dwSize*2); |
| ITEXTCTL_SetText(pThis->m_pStatic,pFileContent,-1); |
| FREEIF(pFileContent); |
| FREEIF(pszLine); |
| IFILE_Release(pIFile); |
| nErr=IFILEMGR_GetLastError(pIFileMgr); |
| DBGPRINTF(“%s -Error=%d”,”Error in creating a file”,nErr); |
| } |
| IFILEMGR_Release(pIFileMgr); |
| FREE(pzFileNameBuf); |
| } |
按逻辑行读取
以回车换行符一行一行异步读取。
| void OpenFile(AS_APP_MAINWIN_T * pi) |
| { |
| IFileMgr * pIFileMgr; |
| int nErr; |
| char* pzFileNameBuf = NULL; |
| IFile *pIFile; |
| ISourceUtil *pisu; |
| ISource *pisource; |
| AECHAR szFileName[]={‘o’,'p’,'e’,'r’,'a’,'t’,'i’,'o’,'n’,’.’,'t’,'x’,'t’, ‘\0′}; |
| ISHELL_CreateInstance(pi->m_pIShell,AEECLSID_FILEMGR,(void **)&pIFileMgr); |
| ISHELL_CreateInstance(pi->m_pIShell,AEECLSID_SOURCEUTIL,(void **)&pisu); |
| WSTRTOSTR(szFileName,pzFileNameBuf,64); |
| pIFile=IFILEMGR_OpenFile(pIFileMgr,pzFileNameBuf,_OFM_READ); |
| if(pIFile) |
| { |
| ISOURCEUTIL_SourceFromAStream(pisu,(IAStream *)pIFile,&pisource); |
| ISOURCEUTIL_GetLineFromSource(pisu,pisource, 1100, |
| ISOURCE_Release(pisource); |
| ISOURCEUTIL_Release(pisu); |
| IFILE_Release(pIFile); |
| FileAction_ReadLines(pi); |
| } |
| else |
| { |
| nErr=IFILEMGR_GetLastError(pIFileMgr); |
| DBGPRINTF(“%s -Error=%d”,”Error in creating a file”,nErr); |
| } |
| AS_APP_RELEASEIF(pIFileMgr); |
| FREE(pzFileNameBuf); |
| } |
| static void FileAction_ReadLines(AS_APP_MAINWIN_T * pThis) |
| { |
| int rv; |
| GetLine gl; |
| // read a line |
| rv = IGETLINE_GetLine(pThis->piGetLine, &gl, IGETLINE_LF); |
| if (rv == IGETLINE_WAIT) { |
| CALLBACK_Init(&pThis->m_cb, WebAction_ReadLines, pThis); |
| IGETLINE_Peekable(pThis->piGetLine, &pThis->m_cb); |
| return; |
| } |
| DBGPRINTF(“%s\n”, gl.psz); |
| // if stream has not reached EOF or ERROR |
| if (!IGETLINE_Exhausted(rv)) { |
| // wait for more data |
| CALLBACK_Init(&pThis->m_cb, WebAction_ReadLines, pThis); |
| IGETLINE_Readable(pThis->piGetLine, &pThis->m_cb); |
| return; |
| } |
| } |
固定长度读入文件
| extern void MM_UI_FILEVIEW_ReadFile(IWindow * po,char *pFileName) |
| { |
| IFileMgr * pIFileMgr; |
| int nErr; |
| MM_UI_FILEVIEW_T * pThis = (MM_UI_FILEVIEW_T *)po; |
| MM_APPLET_INFO_T *pOwner=pThis->m_pOwner; |
| char* pzFileNameBuf = NULL; |
| IFile *pIFile; |
| AECHAR szFileName[]={‘o’,'p’,'e’,'r’,'a’,'t’,'i’,'o’,'n’,’.’,'t’,'x’,'t’, ‘\0′}; |
| char szLine[80]; |
| AECHAR szLine1[80]; |
| int nRet; |
| ISTATIC_SetProperties(pThis->m_pStatic,ST_ASCII); |
| ISHELL_CreateInstance(pThis->m_pIShell,AEECLSID_FILEMGR,(void **)&pIFileMgr); |
| pzFileNameBuf=(char *)MALLOC(64); |
| // WSTRTOSTR(szFileName,pFileName,64); |
| pIFile=IFILEMGR_OpenFile(pIFileMgr,pFileName,_OFM_READ); |
| if(pIFile) |
| { |
| nRet=IFILE_Read(pIFile,szLine,80); |
| while(nRet) |
| { |
| szLine[nRet]=0; |
| STRTOWSTR(szLine,szLine1,80); |
| ISTATIC_SetTextEx(pThis->m_pStatic,(byte * )szLine,NULL,TRUE); |
| nRet=IFILE_Read(pIFile,szLine,80); |
| } |
| STRTOWSTR(szLine,szLine1,80); |
| //ISTATIC_SetTextEx(pThis->m_pStatic,(byte * )szLine,NULL,TRUE); |
| IFILE_Release(pIFile); |
| } |
| else |
| { |
| nErr=IFILEMGR_GetLastError(pIFileMgr); |
| DBGPRINTF(“%s -Error=%d”,”Error in creating a file”,nErr); |
| } |
| IFILEMGR_Release(pIFileMgr); |
| FREE(pzFileNameBuf); |
| } |
本文深入探讨了BREW提供的EFS接口,包括IFileMgr、IFile、IAStream接口的功能与使用方法,以及如何通过这些接口进行文件和目录的管理、读写操作。文章详细解释了创建、删除、重命名文件或目录的方法,并介绍了如何获取文件信息、检测文件或目录是否存在、创建和删除目录、打开、重命名或删除文件等操作。同时,还展示了如何通过IAStream接口进行异步数据读取,以及IFile接口进行文件内容的读取和修改。文章最后提供了具体实例代码,帮助开发者更好地理解和应用这些接口。

1154

被折叠的 条评论
为什么被折叠?



