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

文件名允许最大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);

}

MTK:文件操作接口详解相关推荐

  1. 简述python文件操作_Python 文件操作的详解及实例

    Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. ...

  2. C语言文件操作超详解(万字解读,细致入微)

    目录 一.什么是文件 1.程序文件 2.数据文件 二.文件名 三.文件的打开和关闭 1.文件指针 2.文件操作--打开和关闭 fopen函数(包含在头文件stdio.h中)的解析: fclose函数( ...

  3. 一次性就能学会的文件操作!(文件操作函数详解)

    前言:在上一篇博客关于文件的基础知识中我们对文件有了一定的了解,本篇博客将会详细讲解操作文件的函数. 文章目录 文件的顺序读写 字符输入输出函数 -- fgetc 与 fputc fputc函数 fg ...

  4. python文件操作模式是什么,python --文件操作模式详解

    #f= open(r"aaa/a.txt",mode='rt') # f的值是一种变量,占用的是应用程序的内存空间,此时牵扯的是两个方面的资源 #print(f) ##2.操作文件 ...

  5. C语言进阶-文件操作超详解

    目录 为什么使用文件 什么是文件 分类(从文件功能的角度) 文件名 文件的打开和关闭 文件指针 fopen和fclose函数 打开方式表 文件的顺序读写 顺序读写函数表 什么是输入输出流 fgetc/ ...

  6. unity 在移动平台中,文件操作路径详解

    转载于http://www.unitymanual.com/thread-23491-1-1.html 一.在项目根目录中创建Resources文件夹来保存文件. 可以使用Resources.Load ...

  7. python读写文件操作_详解Python文件读写操作

    读文件 打开文件(文件需要存在)#打开文件 f = open("data.txt","r") #设置文件对象 print(f)#文件句柄 f.close() # ...

  8. Java8 Stream流式操作接口详解

    stream是用于集合使用的流式操作,可使用collection.stream获取流 default Stream<E> stream() {return StreamSupport.st ...

  9. C语言文件操作函数详解

    转载自https://www.cnblogs.com/saolv/p/7793379.html C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库 ...

最新文章

  1. Arrays类、大数据运算
  2. 查找数组中第K个最小值
  3. how to collect staff from lovespace
  4. Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time), mtime(modify time)...
  5. Win7系统局域网抢网速的方法
  6. python字符串批量替换、修改多个字符的方法实例
  7. linux中设备文件的主要内容包括什么,LINUX期末考试复习题.doc
  8. 解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】
  9. 面对 Google、Facebook、微软等科技巨头的围剿,夹缝中的初创企业该何去何从?...
  10. login.html id=9453,我关注的官网.html
  11. 将mysql驱动包添加到项目依赖
  12. php使用blob加密视频,javascript实现blob加密视频源地址的方法
  13. 软件项目文档——WBS
  14. oa办公系统服务器网址是什么,OA办公系统登陆地址是多少呢?
  15. java poi 替换word,POI替换Word中的mark标记(指定字符串)
  16. ecshop其他页面判断是智能手机访问也跳转到ECTouch对应手机版页面[有修正]
  17. 成百家之言,纳万端思辨,SDCC 2017·深圳站响号以待
  18. 跨考计算机专业怎么学,跨考计算机考研经验分享
  19. mongodb时间差8小时,原因及解决方案
  20. React 中constructor 作用

热门文章

  1. ×××病毒分析工具集之File Format Identifier v1.0
  2. CentOS 7 怎样自动连接网络
  3. NMET PEER DEPENDENCY解决方法
  4. 高性能javascript读书笔记(三.DOM 编程2)
  5. Nginx 屏蔽ip地址的方法
  6. PowerShell 中执行 dir /b /s
  7. 引用css样式时,一个class引用两个样式的写法( class=ico001 icoCom)。
  8. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 (以后在写SQL时,要有这种思想!!!)
  9. 力扣题目——566. 重塑矩阵
  10. 【Hive】性能调优 - map-side JOIN