《MTK芯片开发指南》 第九章节选(转载)

来源:互联网 发布:淘宝贷在哪里 编辑:程序博客网 时间:2024/06/08 10:56
9.2
文件读写
在任何平台上开发应用程序,最基础的就是文件的输入输出。任何需要持久化存储的数据,都离不开文件读写。
MTK使用FAT文件系统,对于模拟器文件系统放在目录plutommiWIN32FS下,如DRIVE_C、DRIVE_D等等。
我们通过一系列实例来具体讲解文件的读写过程。
·
创建目录
首先在E盘根目录下创建文件夹FileTest。编写一个函数CreateFileDir来实现该功能:
#include "fs_type.h"#include "Fs_func.h "#include "fs_errcode.h"#include "SettingProfile.h"#include "CommonScreens.h"#define MAX_FILENAME_LEN 40#define FILE_PATH              L"E:FileTest"//文件路径S32 CreateFileDir(U16* DirName){   FS_HANDLE fh;   FS_DOSDirEntry           file_info;   U16 filename[MAX_CUSTOM_FILENAME_LEN];   fh = FS_FindFirst(DirName, FS_ATTR_DIR,0, &file_info, filename,MAX_CUSTOM_FILENAME_LEN);   //如果系统已有该目录,就关闭先前的文件句柄   if(fh >= FS_NO_ERROR)   {       FS_FindClose(fh);       return fh;   }   else   {        //如果没找到目录则创建目录        fh = FS_CreateDir(DirName);        FS_FindClose(fh);        return fh;                                  }}//在屏幕函数中调用CreateFileDirvoid EntryFirstAppScreen(void){    FS_HANDLE    handleFind;    FS_DOSDirEntry file_info;    U16              filename[MAX_FILENAME_LEN];    S32 i = 0;    EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);    entry_full_screen();    clear_screen();       //创建目录    handleFind = CreateFileDir(L"E:FileTest");    if(handleFind >= 0)    {     //只要创建成功,就显示一个弹出窗口,显示成功。      DisplayPopup((PU8)GetString(STR_GLOBAL_OK), IMG_GLOBAL_OK,1, 1000, SUCCESS_TONE);     //显示完毕,返回到Organizer界面。     DeleteUptoScrID(ORGANIZER_SCREENID);   }}保存上述代码,编译运行模拟器。在屏幕显示弹出窗口之后,即可在模拟器的文件系统中找到新创建的目录FileTest.plutommiWIN32FSDRIVE_EFileTest 创建成功。创建新文件在之前创建的目录中,搜索customFile.txt文件。void EntryFirstAppScreen(void){    FS_HANDLE       handleFind;    FS_DOSDirEntry        file_info;    U16                       filename[MAX_CUSTOM_FILENAME_LEN];    S32 i = 0;    EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);    entry_full_screen();    clear_screen();    //创建目录      handleFind = CreateFileDir(L"E:FileTest");     if(handleFind >= 0)    {         handleFind = FS_Open(L"E:FileTestcustomFile.txt",FS_CREATE|FS_READ_WRITE);     }     else //创建失败     {          return;     }     FS_Close(handleFind);//再不需要的时候,一定要将句柄关闭释放。}保存修改,编译运行模拟器。目录plutommiWIN32FSDRIVE_EFileTest下成功地生成了文件customFile.txt。
写入数据
我们尝试写入一段学生数据信息到刚刚创建的文件中。
学生数据包括:姓名,年龄,性别,学号,总成绩等。所以,使用一个结构体来存储。
typedef struct{U8 stuName[16];U8 stuAge;U8 stuSex[8];S32 stuNumber;S16 stuScore;//上一次保存时候的记忆模式} StudentData;
声明一个全局StudentData实例:
StudentData stuData;
定义一个函数,封装写操作:
void WriteStuData(U16 *FileName,void *DataPtr,S32 offSet,UINT DataSize){       FS_HANDLE WriteHandle;       UINT Leng=0;       WriteHandle = FS_Open(FileName,FS_CREATE|FS_READ_WRITE);       if (WriteHandle >=0)      {           FS_Seek(WriteHandle, offSet, FS_FILE_BEGIN);           FS_Write(WriteHandle,DataPtr,DataSize,&Leng);//       }       else       {            DisplayPopup((PU8)GetString(STR_GLOBAL_ERROR),IMG_GLOBAL_ACTIVATED,1, 2000, ERROR_TONE);            DeleteNHistory(0);        }        FS_Close (WriteHandle);}
接下来,我们想实现在当前屏幕中按左键就存储数据的功能。可不可以这样:
SetLeftSoftkeyFunction(WriteStuData, KEY_EVENT_UP);
表明上看起来似乎可行,但是当实际运行中,按左键存储的时候,系统会出现异常。
这是由于函数SetLeftSoftkeyFunction的第一个参数是一个如下形式的函数指针:
void SetLeftSoftkeyFunction(void (*f) (void), MMI_key_event_type k)
可以看到函数指针void (*f) (void)已经明确了传入的函数的形式,即返回值和参数都为void的函数。
所以,我们必须再封装一次:
void SaveData(void)
{
WriteStuData(L"E:FileTestcustomFile.txt",&stuData,0,sizeof(StudentData));
}
上面代码中的stuData请一定要声明为全局变量。
现在,我们就可以在按左键的时候正确调用写数据的函数,最终代码如下:
typedef struct{    U8 stuName[16];    U8 stuAge;    U8 stuSex[8];    S16 stuNumber;    S16 stuScore;} StudentData;StudentData stuData; //声明一个全局实例void WriteStuData(U16 *FileName,void *DataPtr,S32 offSet,UINT DataSize){    FS_HANDLE WriteHandle;    UINT Leng=0;    WriteHandle = FS_Open(FileName,FS_CREATE|FS_READ_WRITE);    if (WriteHandle >=0)    {         FS_Seek(WriteHandle, offSet, FS_FILE_BEGIN);         FS_Write(WriteHandle,DataPtr,DataSize,&Leng);//     }     else     {         DisplayPopup((PU8)GetString(STR_GLOBAL_ERROR),IMG_GLOBAL_ACTIVATED,1, 2000, ERROR_TONE);         DeleteNHistory(0);     }     FS_Close (WriteHandle);}void SaveData(void){    WriteStuData(L"E:FileTestcustomFile.txt",&stuData,0,sizeof(StudentData));}void EntryFirstAppScreen(void){    FS_HANDLE    handleFind;    FS_DOSDirEntry        file_info;    U16          filename[MAX_CUSTOM_FILENAME_LEN];    S32 i = 0;    EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);    entry_full_screen();    clear_screen();    //测试用的数据    strcpy(stuData.stuName , "chenzhipeng");    stuData.stuAge = 25;    strcpy(stuData.stuSex , "male");    stuData.stuNumber = 10115;    stuData.stuScore = 568;    //创建目录    handleFind = CreateFileDir(L"E:FileTest");    if(handleFind >= 0)    {         handleFind = FS_Open(L"E:FileTestcustomFile.txt",FS_CREATE|FS_READ_WRITE);    }    else     {         return;    }    FS_Close(handleFind);    SetLeftSoftkeyFunction(SaveData, KEY_EVENT_UP);    gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);    SetKeyHandler(GoBackHistory,KEY_RSK,KEY_EVENT_UP);}
保存修改,编译并运行模拟器,进入屏幕,按左键后,即可在目录:
plutommiWIN32FSDRIVE_EFileTest 中看到文件customFile.txt已被写入了内容。

读取数据

要读取数据,首先得确定文件是否存在。

handleFind = FS_FindFirst(L"E:FileTest*.txt", 0, 0, &file_info,(U16*)fileName, MAX_CUSTOM_FILENAME_LEN);

FS_FindClose(handleFind);

上面的代码,在目录FileTest下查找后缀名为txt的文件。如果找到就将文件名赋值给fileName,并将该文件信息赋值给file_info

只要是handleFind不小于0,且文件名也和我们之前已创建的相同,就说明文件已经找到。接下来要做的就是读取:

清空EntryFirstAppScreen函数先前的代码,然后添加读代码:

 

转载:

 http://apps.hi.baidu.com/share/detail/20760750

原创粉丝点击