MTK 文件创建及读写

9.2
文件读写
在任何平台上开发应用程序,最基础的就是文件的输入输出。任何需要持久化存储的数据,都离不开文件读写。
MTK使用FAT文件系统,对于模拟器文件系统放在目录plutommiWIN32FS下,如DRIVE_C、DRIVE_D等等。
我们通过一系列实例来具体讲解文件的读写过程。
·
创建目录
首先在E盘根目录下创建文件夹FileTest。编写一个函数CreateFileDir来实现该功能:
[cpp]  view plain copy
  1. #include "fs_type.h"  
  2. #include "Fs_func.h "  
  3. #include "fs_errcode.h"  
  4. #include "SettingProfile.h"  
  5. #include "CommonScreens.h"  
  6.   
  7. #define MAX_FILENAME_LEN 40  
  8. #define FILE_PATH              L"E:FileTest"//文件路径  
  9.   
  10. S32 CreateFileDir(U16* DirName)  
  11. {  
  12.    FS_HANDLE fh;  
  13.    FS_DOSDirEntry           file_info;  
  14.    U16 filename[MAX_CUSTOM_FILENAME_LEN];  
  15.    fh = FS_FindFirst(DirName, FS_ATTR_DIR,0, &file_info, filename,MAX_CUSTOM_FILENAME_LEN);  
  16.    //如果系统已有该目录,就关闭先前的文件句柄  
  17.    if(fh >= FS_NO_ERROR)  
  18.    {  
  19.        FS_FindClose(fh);  
  20.        return fh;  
  21.    }  
  22.    else  
  23.    {  
  24.         //如果没找到目录则创建目录  
  25.         fh = FS_CreateDir(DirName);  
  26.         FS_FindClose(fh);  
  27.         return fh;                                 
  28.    }  
  29. }  
  30. //在屏幕函数中调用CreateFileDir  
  31. void EntryFirstAppScreen(void)  
  32. {  
  33.     FS_HANDLE    handleFind;  
  34.     FS_DOSDirEntry file_info;  
  35.     U16              filename[MAX_FILENAME_LEN];  
  36.     S32 i = 0;  
  37.     EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);  
  38.     entry_full_screen();  
  39.     clear_screen();  
  40.        //创建目录  
  41.     handleFind = CreateFileDir(L"E:FileTest");  
  42.     if(handleFind >= 0)  
  43.     {  
  44.      //只要创建成功,就显示一个弹出窗口,显示成功。  
  45.       DisplayPopup((PU8)GetString(STR_GLOBAL_OK), IMG_GLOBAL_OK,1, 1000, SUCCESS_TONE);  
  46.      //显示完毕,返回到Organizer界面。  
  47.      DeleteUptoScrID(ORGANIZER_SCREENID);  
  48.    }  
  49. }  
  50. 保存上述代码,编译运行模拟器。在屏幕显示弹出窗口之后,即可在模拟器的文件系统中找到新创建的目录FileTest.  
  51. plutommiWIN32FSDRIVE_EFileTest 创建成功。  
  52. 创建新文件  
  53. 在之前创建的目录中,搜索customFile.txt文件。  
  54. void EntryFirstAppScreen(void)  
  55. {  
  56.     FS_HANDLE       handleFind;  
  57.     FS_DOSDirEntry        file_info;  
  58.     U16                       filename[MAX_CUSTOM_FILENAME_LEN];  
  59.     S32 i = 0;  
  60.     EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);  
  61.     entry_full_screen();  
  62.     clear_screen();  
  63.     //创建目录    
  64.     handleFind = CreateFileDir(L"E:FileTest");   
  65.     if(handleFind >= 0)  
  66.     {  
  67.          handleFind = FS_Open(L"E:FileTestcustomFile.txt",FS_CREATE|FS_READ_WRITE);  
  68.      }  
  69.      else //创建失败  
  70.      {  
  71.           return;  
  72.      }  
  73.      FS_Close(handleFind);//再不需要的时候,一定要将句柄关闭释放。  
  74. }  
  75. 保存修改,编译运行模拟器。  
  76. 目录plutommiWIN32FSDRIVE_EFileTest下成功地生成了文件customFile.txt。  
写入数据
我们尝试写入一段学生数据信息到刚刚创建的文件中。
学生数据包括:姓名,年龄,性别,学号,总成绩等。所以,使用一个结构体来存储。
[cpp]  view plain copy
  1. typedef struct  
  2. {  
  3. U8 stuName[16];  
  4. U8 stuAge;  
  5. U8 stuSex[8];  
  6. S32 stuNumber;  
  7. S16 stuScore;//上一次保存时候的记忆模式  
  8. } StudentData;  
声明一个全局StudentData实例:
StudentData stuData;
定义一个函数,封装写操作:
[cpp]  view plain copy
  1. void WriteStuData(U16 *FileName,void *DataPtr,S32 offSet,UINT DataSize)  
  2. {  
  3.        FS_HANDLE WriteHandle;  
  4.        UINT Leng=0;  
  5.        WriteHandle = FS_Open(FileName,FS_CREATE|FS_READ_WRITE);  
  6.        if (WriteHandle >=0)  
  7.       {  
  8.            FS_Seek(WriteHandle, offSet, FS_FILE_BEGIN);  
  9.            FS_Write(WriteHandle,DataPtr,DataSize,&Leng);//  
  10.        }  
  11.        else  
  12.        {  
  13.             DisplayPopup((PU8)GetString(STR_GLOBAL_ERROR),IMG_GLOBAL_ACTIVATED,1, 2000, ERROR_TONE);  
  14.             DeleteNHistory(0);  
  15.         }  
  16.         FS_Close (WriteHandle);  
  17. }  
接下来,我们想实现在当前屏幕中按左键就存储数据的功能。可不可以这样:
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请一定要声明为全局变量。
现在,我们就可以在按左键的时候正确调用写数据的函数,最终代码如下:
[cpp]  view plain copy
  1. typedef struct  
  2. {  
  3.     U8 stuName[16];  
  4.     U8 stuAge;  
  5.     U8 stuSex[8];  
  6.     S16 stuNumber;  
  7.     S16 stuScore;  
  8. } StudentData;  
  9. StudentData stuData; //声明一个全局实例  
  10.   
  11. void WriteStuData(U16 *FileName,void *DataPtr,S32 offSet,UINT DataSize)  
  12. {  
  13.     FS_HANDLE WriteHandle;  
  14.     UINT Leng=0;  
  15.     WriteHandle = FS_Open(FileName,FS_CREATE|FS_READ_WRITE);  
  16.     if (WriteHandle >=0)  
  17.     {  
  18.          FS_Seek(WriteHandle, offSet, FS_FILE_BEGIN);  
  19.          FS_Write(WriteHandle,DataPtr,DataSize,&Leng);//  
  20.      }  
  21.      else  
  22.      {  
  23.          DisplayPopup((PU8)GetString(STR_GLOBAL_ERROR),IMG_GLOBAL_ACTIVATED,1, 2000, ERROR_TONE);  
  24.          DeleteNHistory(0);  
  25.      }  
  26.      FS_Close (WriteHandle);  
  27. }  
  28. void SaveData(void)  
  29. {  
  30.     WriteStuData(L"E:FileTestcustomFile.txt",&stuData,0,sizeof(StudentData));  
  31. }  
  32. void EntryFirstAppScreen(void)  
  33. {  
  34.     FS_HANDLE    handleFind;  
  35.     FS_DOSDirEntry        file_info;  
  36.     U16          filename[MAX_CUSTOM_FILENAME_LEN];  
  37.     S32 i = 0;  
  38.   
  39.     EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);  
  40.     entry_full_screen();  
  41.     clear_screen();  
  42.     //测试用的数据  
  43.     strcpy(stuData.stuName , "chenzhipeng");  
  44.     stuData.stuAge = 25;  
  45.     strcpy(stuData.stuSex , "male");  
  46.     stuData.stuNumber = 10115;  
  47.     stuData.stuScore = 568;  
  48.     //创建目录  
  49.     handleFind = CreateFileDir(L"E:FileTest");  
  50.     if(handleFind >= 0)  
  51.     {  
  52.          handleFind = FS_Open(L"E:FileTestcustomFile.txt",FS_CREATE|FS_READ_WRITE);  
  53.     }  
  54.     else   
  55.     {  
  56.          return;  
  57.     }  
  58.     FS_Close(handleFind);  
  59.     SetLeftSoftkeyFunction(SaveData, KEY_EVENT_UP);  
  60.     gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);  
  61.     SetKeyHandler(GoBackHistory,KEY_RSK,KEY_EVENT_UP);  
  62. }  
保存修改,编译并运行模拟器,进入屏幕,按左键后,即可在目录:
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函数先前的代码,然后添加读代码:

猜你喜欢

转载自blog.csdn.net/sierllen/article/details/7496871
MTK
今日推荐