• (转载) 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函数先前的代码,然后添加读代码:

  • 相关阅读:
    1028. Hanoi Tower Sequence
    sicily 1063. Who's the Boss
    ubuntu 12.04 x86_64:java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons
    ubuntu12.04 desktop默认无ssh支持
    取消putty右键粘贴功能
    gcc编译参数之m32 m64
    Invalid command 'RailsBaseURI'
    Ubuntu 12.4 server 安装 redmine
    查看Samba用户的方法
    【转】windows浏览共享切换用户登录的方法
  • 原文地址:https://www.cnblogs.com/sierllen/p/2480835.html
Copyright © 2020-2023  润新知