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);
}
MTK:文件操作接口详解相关推荐
- 简述python文件操作_Python 文件操作的详解及实例
Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. ...
- C语言文件操作超详解(万字解读,细致入微)
目录 一.什么是文件 1.程序文件 2.数据文件 二.文件名 三.文件的打开和关闭 1.文件指针 2.文件操作--打开和关闭 fopen函数(包含在头文件stdio.h中)的解析: fclose函数( ...
- 一次性就能学会的文件操作!(文件操作函数详解)
前言:在上一篇博客关于文件的基础知识中我们对文件有了一定的了解,本篇博客将会详细讲解操作文件的函数. 文章目录 文件的顺序读写 字符输入输出函数 -- fgetc 与 fputc fputc函数 fg ...
- python文件操作模式是什么,python --文件操作模式详解
#f= open(r"aaa/a.txt",mode='rt') # f的值是一种变量,占用的是应用程序的内存空间,此时牵扯的是两个方面的资源 #print(f) ##2.操作文件 ...
- C语言进阶-文件操作超详解
目录 为什么使用文件 什么是文件 分类(从文件功能的角度) 文件名 文件的打开和关闭 文件指针 fopen和fclose函数 打开方式表 文件的顺序读写 顺序读写函数表 什么是输入输出流 fgetc/ ...
- unity 在移动平台中,文件操作路径详解
转载于http://www.unitymanual.com/thread-23491-1-1.html 一.在项目根目录中创建Resources文件夹来保存文件. 可以使用Resources.Load ...
- python读写文件操作_详解Python文件读写操作
读文件 打开文件(文件需要存在)#打开文件 f = open("data.txt","r") #设置文件对象 print(f)#文件句柄 f.close() # ...
- Java8 Stream流式操作接口详解
stream是用于集合使用的流式操作,可使用collection.stream获取流 default Stream<E> stream() {return StreamSupport.st ...
- C语言文件操作函数详解
转载自https://www.cnblogs.com/saolv/p/7793379.html C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现.文件操作标准库 ...
最新文章
- Arrays类、大数据运算
- 查找数组中第K个最小值
- how to collect staff from lovespace
- Linux系统文件有三个主要的时间属性,分别是ctime(change time), atime(access time), mtime(modify time)...
- Win7系统局域网抢网速的方法
- python字符串批量替换、修改多个字符的方法实例
- linux中设备文件的主要内容包括什么,LINUX期末考试复习题.doc
- 解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】
- 面对 Google、Facebook、微软等科技巨头的围剿,夹缝中的初创企业该何去何从?...
- login.html id=9453,我关注的官网.html
- 将mysql驱动包添加到项目依赖
- php使用blob加密视频,javascript实现blob加密视频源地址的方法
- 软件项目文档——WBS
- oa办公系统服务器网址是什么,OA办公系统登陆地址是多少呢?
- java poi 替换word,POI替换Word中的mark标记(指定字符串)
- ecshop其他页面判断是智能手机访问也跳转到ECTouch对应手机版页面[有修正]
- 成百家之言,纳万端思辨,SDCC 2017·深圳站响号以待
- 跨考计算机专业怎么学,跨考计算机考研经验分享
- mongodb时间差8小时,原因及解决方案
- React 中constructor 作用
热门文章
- ×××病毒分析工具集之File Format Identifier v1.0
- CentOS 7 怎样自动连接网络
- NMET PEER DEPENDENCY解决方法
- 高性能javascript读书笔记(三.DOM 编程2)
- Nginx 屏蔽ip地址的方法
- PowerShell 中执行 dir /b /s
- 引用css样式时,一个class引用两个样式的写法( class=ico001 icoCom)。
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 (以后在写SQL时,要有这种思想!!!)
- 力扣题目——566. 重塑矩阵
- 【Hive】性能调优 - map-side JOIN