MTK文件操作函数

文件系统是对一个存储设备上的数据和元数进行组织的机制。

文件名允许最大255个字符,绝对路径允许最大为260个字符。

1. int FS_Open(constWCHAR *FileName, UINT Flag)

该函数用来打开一个文件,FielName为文件路径及文件名,在传入函数时,请保证其是宽字符。文件名对大小写不敏感,最终传入函数的文件名都会转换为大写。Flag为文件的操作属性,其值可为:

FS_READ_WRITE:文件打开后,可读可写。

FS_READ_ONLY:只读访问

FS_OPEN_SHARED:设置该标志,可以避免“Access Denied“的异常。默认情况下,FS允许具有只读属性的文件多次打开,但如果又需要进行写操作,就会出现上面的异常。设置该标志即可。

FS_CREATE:如果传入的文件名所指示的文件不存在的话,则创建此文件。

FS_CREATE_ALWAYS:指示FS_OPEN总是创建一个文件,即使文件存在。

FSCOMMITTED:所有修改过的文件立即写入物理设备。

FS_CACHE_DATA:指示FS为该文件不要丢弃缓存中的数据。

FS_LAZY_DATA:指示不要刷新脏数据缓冲。这个标志可以在相同数据写入多次的情况下,大大提高性能,因为重复的数据仅仅是不断的覆盖先前内容,而不会实际写在物理设备上。

如果文件打开成功,该函数返回当前文件的句柄(一个大于等于0的值),否则返回一个小于0 的值。具体操作方法可如下:

FS_HANDLE h;

if((h = (FS_HANDLE)FS_Open(L”C:\\test.txt”,FS_READ_WRITE))>= 0)

{
             FS_Close(h);

}

注意,这里的路径要转换成Unicode字符串,可以通过AnsiiToUnicodeString(S8* pOutBuffer, S8 * pInBuffer)函数来实现。比如我们在D盘的example 文件夹下有一个test.c文件需要对其进行修改(D:/example/test.c),则:

FS_HANDLE h;

S8 UnicodeName[100];

AnsiiToUnicodeString((S8*) UnicodeName, (S8*)” D://example//test.c”);

if((h = (FS_HANDLE)FS_Open((const WCHAR *)UnicodeName, FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0)
{

          FS_Close(h);

}

也可使用FS_Open((constWCHAR *) L” D://example//test.c”,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)方式打开。

当对文件修改完成后,要使用函数FS_Close()将其关闭。

2. intFS_Close(FS_HANDLEFileHandle)

用来关闭一个已经打开的文件。释放所有和打开文件的资源。

函数成功,返回FS_NO_ERROR。函数失败,返回一个负数的错误码。

3. intFS_Read(FS_HANDLEFileHandle, void * DataPtr, UINT Length, UINT * Read)

该函数用来将文件中的内容读取到一个DataPtr指向的缓冲区中。

FileHandle为已打开文件的句柄。

Length为要读取的字节数。

Read为实际读取到的字节数。在下面的例子中,我们将从前面打开的文件中读取100个字节(假设有)的数据到数组buf[]中:

FS_HANDLE h;

UINT read;

S8 buf[256];

S8UnicodeName[100];

memset(buf, 0,sizeof(buf));

AnsiiToUnicodeString((S8*) UnicodeName, (S8*)” D://example//test.c”);

if((h = (FS_HANDLE)FS_Open((const WCHAR *)UnicodeName, FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0)
{

         FS_Read(h, (void*)buf, 100, &read);

         FS_Close(h);

}

4. intFS_Write(FS_HANDLEFileHandle, void * DataPtr, UINT Length, UINT * Written)

该函数用来将指针DataPtr指向的缓冲区数据写到文件中去。

Length为要写入的数据的字节数,

Written值为实际写入的字节数,如下:

UINT len, written;

FS_Write(h, (void*)buf,len,&written);

5. intFS_Commit(FS_HANDLEFileHandle)

立即刷新文件缓冲区的数据并写入到磁盘,一般在FS_Write写完文件后用此函数来确保数据都被写进去。

6. intFS_Seek(FS_HANDLE FileHandle,int Offset, int Whence)

该函数用来将文件指针指向某个位置,Whence的取值有FS_FILE_BEGIN、FS_FILE_CURRENT和FS_FILE_END。比如可用如下方法将文件指向末尾部分,FS_Seek(h, 0,FS_FILE_END);然后可在文件末尾追加写入数据。Offset为文件指针的偏移,例如FS_Seek(h,-5,FS_FILE_CURRENT)将文件指针向前移5个字节,如果是向后移5个字节的话则offset值为5。

7. intFS_GetFileSize(FS_HANDLEFileHandle, UINT * Size)

该函数返回文件的大小(即字节数);

8. intFS_Delete(const WCHAR *FileName)

该函数用来删除一个文件。

下面,我们用一个实例将以上几个函数联系起来使用。实例具体为:将一个文件中的内容(假定不多于5000个字节)全部读出来然后再追加到它自己的末尾,即将文件的内容copy一遍到它本身,如下:

FS_HANDLE h;

UINT read, written, size;

static S8 buf[5000];

S8 UnicodeName[100];

memset(buf, 0, sizeof(buf));

AnsiiToUnicodeString((S8 *) UnicodeName,(S8*)” D://example//test.c”);

if((h = (FS_HANDLE)FS_Open((constWCHAR *)UnicodeName, FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0)

{

         FS_GetFileSize(h,&size);

         if(size> 0)

         {

                     FS_Read(h, (void *)buf, size, &read);

         }

         FS_Seek(h, 0,FS_FILE_END);

         FS_Write(h,(void*)buf,size, &written);

         FS_Commit(h);

         FS_Close(h);

}

这里的FS_Read(FS_Write)在操作的时候一般会将指定大小的数据读(写)出来,但这并不能保证一定做的到,所以,比较合理的做法是读写完后判断size和read(written)的大小,如果read(written)小于size,则要将剩下的内容再继续读写。

9、int FS_GetFileInfo(FS_HANDLE FILE,FS_FileInfo *FileInfo);

返回当前打开文件的具体信息。

Typedef struct

{

       ConstFS_DOSDirEntry *DirEntry;

       UINTFilePos;

       UINTAllocatedSize;

       UINTClusterChains;

       UINTVolumeSerialNumber;

       Constchar *FullName;

}

函数成功,返回FS_NO_ERROR,此结构体实列将填满各种文件信息。函数失败,返回一个负数错误码。

10、int FS_CreateDir(const WCHAR *DirName); //创建一个新目录

DirName:需要创建的目录名,可以包含任何合法的文件名语法。

函数成功,返回FS_NO_ERROR。函数失败,返回一个负数错误码

11、int FS_FindFirst(constWCHAR *NamePattern,BYTE Attr,BYTE AttrMask,FS_DOSDirEntry *FileInfo,WCHAR*FileNAme,UINT MaxLength);//在目录下搜索匹配NamePattern模式的文件

NamePattern:类似一种正则表达式,传入的文件名可以包含通配符,如“*”,“?”等。

Attr:规定了一系列的文件不需要匹配的属性。

AttrMask:规定了一系列的文件不需要匹配的属性。此两属性开发中都置为0

FileInfo:指向FS_DOSDirEntry结构体实列的指针。如果当前函数返回成功,该机构体实列会填充文件的目录信息。

FileName:已找到的文件的文件名。

MaxLength:文件名最大长度。如果文件名长度大于最大长度,将无法找到

函数成功,表明至少有一个文件符合要求。*FileInfo将包含找到的第一个文件的目录项,并且返回值大于等于0;返回值是一个文件的句柄,该句柄可能被FS_FindNext引用。如函数失败,将返回一个负数的错误码

实列:FS_FindFrist(L”C:\\MTK\\?*.txt”,0,0,&fileInfo,(U16*)pFileName[0],MAX_COURSE_FILENAME_LEN);

12、intFS_FindNext(FS_HANDLE File,FS_DOSDIREntry *FileInfo,WCHAR *FileName,UINTMaxLength); //根据FS_FindFirst返回的句柄,继续查找满足相同条件的文件

File:由FS_FindFirst成功返回的文件句柄。

FileInfo:指向FS_DOSDirEntry结构体实列的指针。如果当前函数返回成功,该结构体实列会填充文件的目录信息。

FileName:已找到的文件的文件名。

MaxLength:文件名最大长度,如果文件的文件名长度大于最大长度,将无法找到

如果函数调用成功,将返回一个大于零的值FS_NO_ERROR,并且*FileInfo和*FileName将分别填充目录项的具体内容和文件的文件名。

如函数调用失败,函数将返回一个负数的错误码。

另外,由于系统分配给函数执行的栈空间不是足够大,所以,如果这里的buf比较大的话要声明成static,不然会栈越界的,而静态(static)型则不占用栈空间。

文件读写:

#include “fs_type.h”

#include “fs_func.h”

#include “fs_errcode.h”

#include “SettingProfile.h”

#include “CommonScreen.h”

#define MAX_FILENAME_LEN 40

#define FILE_PATH L”E:\\FileText”    //文件路径

 

Typedef struct

{

       U8stuName[16];

       U8stuAge;

       U8stuSex[8];

       S32stuNumber;

       S16stuScore;

}StudentData;

Void WriteStuData(U16 *FileName,void*DataPtr,S32 offset,UINT DataSize)

{

       FS_HANDLEWriteHandle;

       UINTLeng = 0;

       WriteHandle= FS_OPEN(FileName,FS_CREATE|FS_READ_HANDLE);

       If(WriteHandle)

       {

              FS_SEEK(WriteHandle,offset,FS_FILE_GEGIN);

              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()

{

       WriteStuData(L”E:\\FileTest\\customFile.txt”,&stuData,0,sizeof(StudentData));

}

S32 CreateFileDir(U16 *DirName)

{

       FS_HANDLEFh;

       FS_DOSDirEntryfile_info;

       U16filename[MAX_CUSTOM_FILENAME_LEN];

       Fh= FS_FindFirst(DirName,FS_ATTR_DIR,0,&file_info,filename,MAX_CUSTOM_FILENAME_LEN);

       if(Fh>=0)

       {

              FS_FindClose(fh);

              Returnfh;

       }else

       {

              Fh= FS_CreateDir(DirName);

              FS_FindClose(fh);

              Returnfh;

       }

}

Void EntryFirstAppScreen()

{

       FS_HANDLEhandleFind;

       FS_DOSDirEntryfile_Info;

       U16filename[MAX_CUSTOM_FILENAME_LEN];

       S8receStr[32];

       S8ageOutput[8];

       S8numOutput[32];

       S8scoreOutput[32];

       S8sexOutput[8];

 

       S32i = 0;

       StudentDatareceStuData;

 

       EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);

       Entry_full_screen();

       Clear_screen();

       Gui_set_text_color((gui_color)(255,0,0));

       handleFind= FS_FindFirst(L”E:\\FileTest\\*.txt”,0,0,&file_info,(U16 *)filename,MAX_CUSTOM_FILENAME_LEN);

 

       Strcpy(stuData.stuName,”dsw”);

       stuData.stuAge= 20;

       strcpy(stuData.stuSex,”dsw”);

       stuData.stuNumber= 110;

       stuData.stuScore= 567;

       //创建目录

       handleFind= CreateFileDir(L”E:\\FileTest”);

       if(handleFind)

       {

              handleFind= FS_OPEN(L”E:\\FileTest\\customFile.txt”,FS_CREATE|FS_READ_WRITE);

       }else

       {

              Return;

       }

       FS_Close(handleFind);

       SetLeftSoftKeyFunction(SaveData,KEY_EVENT_UP);

       SetRightSoftKeyFunction(ShowFirstAppScreen,KEY_EVENT_UP);

       Gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_hight-1);

       SetKeyHandler(GoBackHistory,KEY_RSK,KEY_EVENT_UP);

}

Void ShowFirstAppScreen()

{

       FS_HANDLEhandleFind;

       FS_DOSDirEntryfile_Info;

       U16filename[MAX_CUSTOM_FILENAME_LEN];

       S8receStr[32];

       S8ageOutput[8];

       S8numOutput[32];

       S8scoreOutput[32];

       S8sexOutput[8];

 

       S32i = 0;

       StudentDatareceStuData;

 

       EntryNewScreen(SCR_FIRSTAPP_MAIN,ExitFirstAppScreen,NULL,NULL);

       Entry_full_screen();

       Clear_screen();

       Gui_set_text_color((gui_color)(255,0,0));

       handleFind= FS_FindFirst(L”E:\\FileTest\\*.txt”,0,0,&file_info,(U16 *)filename,MAX_CUSTOM_FILENAME_LEN);

       FS_FindClose(handleFind);

       if(handleFind>= 0)

       {

              handleFind= FS_OPEN(L”E:\\FileTest\\customFile.txt”,FS_CREATE|FS_READ_WRITE);

              if(handleFind>=0)

              {

                     FS_seek(handleFind,0,FS_FILE_GEGIN);

                     FS_READ(handleFind,&receStuData,sizeof(StudengData),NULL);

                     FS_Close(handleFind);

              }

       }

       Gui_move_text_cursor(50,100);

       AnsiiToUnicodeString(receStr,receStuData.stuName);

       Gui_print_text((UI_STRING_TYPE)receStr);

 

       Gui_move_text_cursor(50,120);

       Gui_itoa(receStuData.stuAge,(UI_string_type)ageOutput,10);

       Gui_print_text(ageOutput);

 

       Gui_move_text_cursor(50,140);

       AnsiiToUnicodeString(sexOutput,receStuData.stuSex);

       Gui_print_text((UI_STRING_TYPE)stuSex);

 

       Gui_move_text_cursor(50,160);

       Gui_itoa(receStuData.stuNumber,(UI_string_type)numOutput,10);

       Gui_print_text((UI_STRING_TYPE)numOutput);

      

       Gui_move_text_cursor(50,180);

       Gui_itoa(receStuData.stuScore,scoreOutput,10);

       Gui_print_text(scoreOutput);

      

       SetLeftSoftKeyFunction(SaveData,KEY_EVENT_UP);

       Gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_hight-1);

       SetKeyHandler(GoBackHistory,KEY_RSK,KEY_EVENT_UP);

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值