MTK 文件读写

1. int FS_Open(const WCHAR *FileName, UINT Flag)

该函数用来打开一个文件,FielName为文件路径及文件名,Flag为文件的操作属性,其值可为 FS_READ_WRITE,FS_READ_ONLY,FS_OPEN_SHARED等。如果文件打开成功,该函数返回一个大于等于0的值,否则返回一个小于0 的值。具体操作方法可如下:

FS_HANDLE h;

if((h = (FS_HANDLE)FS_Open((constWCHAR *)filename, FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 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((const WCHAR *) L” D:\\example\\test.c”,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)方式打开。

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

2.int FS_Close(FS_HANDLEFileHandle)

用来关闭一个已经打开的文件。


3.int FS_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.int FS_Write(FS_HANDLEFileHandle, void * DataPtr, UINT Length, UINT * Written)

该函数用来将指针DataPtr指向的缓冲区数据写到文件中去,Length为要写入的数据的字节数,*Written值为实际写入的字节数,如下:

UINT len, written;

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


5.int FS_Commit(FS_HANDLEFileHandle)

该函数用来将缓冲区中还没有写入到文件中的数据写入进文件中去,一般在FS_Write写完文件后用此函数来确保数据都被写进去。


6.int FS_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.int FS_GetFileSize(FS_HANDLEFileHandle, UINT * Size)

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


8.int FS_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,则要将剩下的内容再继续读写。

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

MTK平台的文件清空操作
MTK平台的文件truncate函数为FS_Truncate,下面是实现了一个类似linux函数ftruncate的函数,调用
FS_Truncate,对已经打开的文件进行truncate操作。

int FS_Truncate(FS_HANDLE FileHandle);


int osFtruncate(FS_HANDLE fd, int size)

{
//先seek到文件开头到size位置,再调用FS_Truncate截去后面的部分。           
if( FS_Seek( fd, size, FS_FILE_BEGIN ) >= 0 )
{
if( FS_Truncate( fd ) != FS_NO_ERROR )
{
...
}
}

    return 0;
}

要清空一个文件,调用osFtruncate函数即可:osFtruncate(fd, 0);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值