FATFS函数使用笔记

1.FRESULT f_opendir(DIR *dp,const TCHAR *path);
功能:打开一个目录

参数 功能
dp 指向空目录对象结构体的指针,用来存储即将打开的目录信息
path 路径

返回值FR_OK(0)表示函数执行成功,目录对象结构体被创建,以供后面的读目录调用。
参数dp的结构体类型如下:

typedef struct {
	_FDID	obj;			/* Object identifier ,里面有个objsize记录打开文件字节大小*/
	DWORD	dptr;			/* Current read/write offset */
	DWORD	clust;			/* Current cluster */
	DWORD	sect;			/* Current sector */
	BYTE*	dir;			/* Pointer to the directory item in the win[] */
	BYTE*	fn;				/* Pointer to the SFN (in/out) {body[8],ext[3],status[1]} */
#if _USE_LFN != 0
	DWORD	blk_ofs;		/* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */
	WCHAR*	lfn;			/* Pointer to the LFN working buffer */
#endif
#if _USE_FIND
	const TCHAR* pat;		/* Pointer to the name matching pattern */
#endif
} DIR;

2.FRESULT f_readdir(DIR *DirObject,FILINFO *FileInfo);
功能:读取目录下的一个文件,将文件信息存放到FileInfo里面,如果打开目录后,连续调用该函数,我们能从头到尾按顺序读取到文件,并将文件信息刷新到FileInfo里,当读到最后没有文件可读,则返回一个空字符串到文件信息对象的f_name[]里,据此可以判断目录内所有文件是否读取完毕。

参数 功能
DirObject 指向一个存在(实例化)的目录对象结构体(该结构体由打开目录函数创建)
FileInfo 指向一个空的文件信息对象结构体,由该函数创建

返回值FR_OK(0)表示函数执行成功。
FILINFO结构体类型:

typedef struct {
	FSIZE_t	fsize;			/* 文件大小(单位字节) */
	WORD	fdate;			/* 修改日期 */
	WORD	ftime;			/* 修改时间 */
	BYTE	fattrib;		/* 文件属性 */
#if _USE_LFN != 0
	TCHAR	altname[13];			/* Altenative file name */
	TCHAR	fname[_MAX_LFN + 1];	/* Primary file name */
#else
	TCHAR	fname[13];		/* 文件名(字节个数最大13个) */
#endif
} FILINFO;

3.FRESULT f_closedir (DIR *dp);

参数 功能
dp 指向已存在的目录对象结构体的指针,销毁目录对象

4.FRESULT f_ open(FIL* FileObject, const TCHAR* FileName, BYTE ModeFlags);

参数 功能
FileObject 指向一个空的文件对象结构体的指针,由该函数创建
FileName 由用户传进去的已存在的文件名
ModeFlags 文件打开模式,有以下几种模式可供选择: FA_READ,FA_WRITE,FA_CREATE_ALWAYS,FA_OPEN_ALWAYS ,FA_CREATE_NEW几种模式可以通过’或’同时存在

FIL结构体类型:

typedef struct {
	_FDID	obj;		/* Object identifier */
	BYTE	flag;			/* File status flags */
	BYTE	err;			/* Abort flag (error code) */
	FSIZE_t	fptr;			/* File read/write pointer (文件打开的时候是0) */
	DWORD	clust;		/* Current cluster of fpter (not valid when fprt is 0) */
	DWORD	sect;			/* Sector number appearing in buf[] (0:invalid) */
#if !_FS_READONLY
	DWORD	dir_sect;		/* Sector number containing the directory entry */
	BYTE*	dir_ptr;		/* Pointer to the directory entry in the win[] */
#endif
#if _USE_FASTSEEK
	DWORD*	cltbl;			/* Pointer to the cluster link map table (Nulled on file open) */
#endif
#if !_FS_TINY
	BYTE	buf[_MAX_SS];	/* File private data read/write window */
#endif
} FIL;

5.FRESULT f_read (FIL* fp,void* buff,UINT btr,UINT* br);

参数 功能
fp 指向一个已存在的文件对象
buff 指向数据缓存区
btr 期望读取的字节数
br 指向UINT的指针,UINT变量存放实际读取的字节数

返回值FR_OK(0)表示函数执行成功。正常情况下,使用f_open函数打开一个文件后,能通过FIL结构体里面的obj得到文件的字节大小,这样结合Ram的大小,在知道文件大小的情况下一次性或者分几次读完文件内容。f_read函数可以连续调用几次,当(*br)等于0表示文件已经读完了。使用之前注意f_open使用FA_READ模式。
6.FRESULT f_write (FIL* fp,const void* buff,UINT btw,UINT* bw);

参数 功能
fp 指向一个已存在的文件对象
buff 指向数据源数组
btw 期望写入的字节数
bw 指向UINT的指针,UINT变量存放实际写入的字节数

返回值FR_OK(0)表示函数执行成功。在文件的结尾写入bw个字节。
7.FRESULT f_lseek (FIL* fp,FSIZE_t ofs);

参数 功能
fp 指向一个已存在的文件对象
ofs 偏移量(单位:字节)

返回值FR_OK(0)表示函数执行成功。应用场景可以是这样,打开一个文件,然后调用该函数将光标偏移n个字节,接着就可以调用文件写函数或者文件读函数读写数据了,这就意味着写文件不一定需要在文件结尾写,只要通过f_lseek函数调整偏移位置就可以在文件某个位置写数据了。读文件可以跳过文件信息头直接读文件内容。
8.FRESULT f_sync (FIL* fp);

参数 功能
fp 指向一个已存在的文件对象

返回值FR_OK(0)表示函数执行成功。f_sync 函数执行和 f_close 函数相同的处理,不同在于执行后文件仍保持打开,文件对象依然有效,可以继续对文件进行读/写/移动操作; 当文件处于长时间的写模式,如数据记录时,周期性调用此函数,或写入数据后立即调用此函数,可以减少因断电等意外情况带来的损失。
9.FRESULT f_close (FIL* fp);

参数 功能
Fp 指向一个已存在的文件对象

返回值FR_OK(0)表示函数执行成功。关闭一个文件。当执行打开文件函数之后不用文件了应该调用f_close关闭文件。
10.FRESULT f_unlink (const TCHAR* path);

参数 功能
path 指向一个文件或者路径

返回值FR_OK(0)表示函数执行成功。删除一个文件。
11.FRESULT f_mkdir (const TCHAR* path);

参数 功能
path 路径下要创建的文件夹

返回值FR_OK(0)表示函数执行成功。在某个路径下创建一个文件夹,比如:path为”0:/one”的时候表示在根目录下创建一个名为one的空文件夹。如果想在空文件夹里边新建文件,可以使用f_open函数,模式选择FA_CREATE_NEW。

上一篇:coreldraw打造母亲节艺术字效果的方法(图文教程)


下一篇:Photoshop打造纹理的凹凸感的超质感金属字