(转载) MTK 文件管理

文件读写在任何平台上开发应用程序,最基础的就是文件的输入输出。任何需要持久化存储的数据,都离不开文件读写。
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;                              
   }
}
//在屏幕函数中调用CreateFileDir
void 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函数先前的代码,然后添加读代码:

转载于:https://www.cnblogs.com/sierllen/archive/2012/05/03/2480835.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值