Zephyr_FileSystems
1. 文件系统(File Systems)
Zephyr RTOS 的虚拟文件系统开关允许应用程序在不同的挂载点(如:/fatfs 和 /nffs)挂载多个文件系统。挂载点数据结构包含实例化、挂载和操作文件系统所需的所有必要的信息。文件系统开关通过引入文件系统注册机制,将应用程序从直接访问一个文件系统指定的 API 或内部函数分离开。
在 Zephyr 中,任何文件系统的实现或库可以通过一个文件系统注册 API 插入或拔出。
int fs_register(enum fs_type type, struct fs_file_system_t *fs);
int fs_unregister(enum fs_type type, struct fs_file_system_t *fs);
Zephyr RTOS 通过使用挂载点作为磁盘卷名来支持一个文件系统的多个实例,文件系统库在格式化或挂载到一个磁盘时使用这个卷名。
文件系统的声明如下:
static struct fs_mount_t mp = {.type = FS_FATFS, // FS_FATFS:文件系统的类型,例如:FATFS 或 NFFS。.mnt_point = FATFS_MNTP, // FATFS_MNTP:文件系统的挂载点。.fs_data = &fat_fs, // fat_fs:将被 fs_mount( ) API 使用的文件系统数据。
};
2. 已知限制(Known Limitations)
由于库内部实现的限制,NFFS 只支持文件系统的一个实例。
3. 示例(Sample)
在 samples/subsys/fs 中提供了如何使用文件系统的示例。
4. API 参考(API Reference)
4.1. 定义(Defines)
- FS_SEEK_SET
- FS_SEEK_CUR
- FS_SEEK_END
4.2. 枚举(Enums)
enum fs_dir_entry_type
值:
FS_DIR_ENTRY_FILE = 0
FS_DIR_ENTRY_DIRenum fs_type
值:
FS_FATFS = 0
FS_NFFS
FS_TYPE_END
4.3. 函数(Functions)
int fs_open(struct fs_file_t * zfp, const char * file_name)
打开文件。
打开一个已存在文件或创建一个新的文件,并将一个流与其关联。
参数:- zfp:指向文件对象的指针。
- file_name:要打开的文件名。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_close(struct fs_file_t * zfp)
关闭文件。
刷新关联的流,并关闭文件。
参数:- zfp:指向文件对象的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
fs_unlink(const char * path)
删除文件链接(File unlink)。
删除指定的文件或目录。
参数:- path:要删除的文件或目录的路径。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_rename(const char * from, const char * to)
文件或目录重命名。
执行指定源路径的重命名和或移动到指定的目的地。源路径可以引用文件或目录。目标路径中的所有中间目录必须已经存在。如果源路径引用文件,则目标路径必须包含完整的文件名路径,而不仅仅是新的父目录。如果一个对象已经在指定的目标路径上存在,这个函数会在重命名之前将其删除链接(即:目标被损毁(the destination gets clobbered))。
参数:- from:源路径。
- to:目的路径。
返回值:
- 0:成功。
- -ERRNO:错误代码。
ssize_t fs_read(struct fs_file_t * zfp, void * ptr, size_t size)
读文件。
返回:读取的字节数。如果成功,读取的字节数将等于要求读取的字节数。如果文件中没有足够的有效字节数,将返回少于要求读取的字节数。发生错误时将返回 -ERRNO。
参数:- zfp:指向文件对象的指针。
- ptr:指向数据缓存区的指针。
- size:要求读取的字节数。
ssize_t fs_write(struct fs_file_t * zfp, const void * ptr, size_t size)
写文件。
返回:写入的字节数。如果成功,写入的字节数将等于要求写入的字节数。其它任何值都表示出错。错误时将返回 -ERRNO。在返回 -ERRNO 的情况下,由于无法启动操作,文件指针将不会被提前(will not be advanced)。如果它能够写入,但不能写入所有要求的字节数,这是因为磁盘已经满了。这种情况下,它将返回少于要求写入的字节数,但不像常规错误那样返回 -ERRNO。
参数:- zfp:指向文件对象的指针。
- ptr:指向数据缓存区的指针。
- size:要求写入的字节数。
int fs_seek(struct fs_file_t * zfp, off_t offset, int whence)
偏移文件。
将文件位置移动到文件中的新位置。偏移量是基于 whence 增加到新位置的。
参数:- zfp:指向文件对象的指针。
- offset:要将文件指针移动的相对偏移。
- whence:计算偏移量的相对位置。
- FS_SEEK_SET:从文件起始处开始偏移。
- FS_SEEK_CUR:从当前位置开始偏移。
- FS_SEEK_END:从文件结尾开始偏移。
返回值:
- 0:成功。
- -ERRNO:错误代码。
off_t fs_tell(struct fs_file_t * zfp)
获取文件的当前位置。
参数:- zfp:指向文件对象的指针。
返回值:
- position:文件当前的位置,当前修订不验证文件对象(Current position in file Current revision does not validate the file object)。
int fs_truncate(struct fs_file_t * zfp, off_t length)
更改打开文件的大小。
如果文件的新长度小于当前文件的大小,则将其截断为新的长度。如果文件的新长度大于当前文件的大小,则将其扩张为新的长度。扩张后的区域填充 0。
Note:在扩张的情况下,如果在扩张时卷已经被填满了,则函数扩张到最大可能的长度并返回成功。调用者应检查扩张的长度与要求的长度是否一致。
参数:- zfp:指向文件对象的指针。
- length:文件的新长度。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_sync(struct fs_file_t * zfp)
刷新打开文件的写缓存。
该函数可以用于刷新打开文件的缓存。可以调用该函数来确保数据立刻写入到存储介质。这样做可能是为了避免在意外断电时丢失数据。**注意,关闭文件时会进行刷新缓存,因此如果文件正在关闭,则不需要调用该函数。参数:
- zfp:指向文件对象的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_mkdir(const char * path)
创建目录。
使用指定路径创建一个新目录。
参数:- path:要创建新目录的路径。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_opendir(struct fs_dir_t * zdp, const char * path)
打开目录。
使用指定路径打开一个已存在的目录。
参数:- zdp:指向目录对象的指针。
- path:要打开新目录的路径。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_readdir(struct fs_dir_t * zdp, struct fs_dirent * entry)
读取目录。
读取打开目录的目录项。
返回:在目录末尾(In end-of-dir)的情况下,将返回 0 并设置 entry->name[0] = 0
参数:- zdp:指向目录对象的指针。
- entry:指向要读取目录项的存放的结构体 zfs_dirent 的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_closedir(struct fs_dir_t * zdp)
关闭目录。
关闭一个打开的目录。
参数:- zdp:指向目录对象的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_mount(struct fs_mount_t * mp)
挂载文件系统。
执行挂载文件系统所需的步骤,如调用文件系统指定挂载函数并将挂载点挂载到文件系统列表中。
参数:- mp:指向结构体 fs_mount_t的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_unmount(struct fs_mount_t * mp)
卸载文件系统。
执行卸载文件系统所需的步骤,如调用文件系统指定卸载函数并将挂载点从文件系统列表中移除。
参数:- mp:指向结构体 fs_mount_t的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_stat(const char * path, struct fs_dirent * entry)
文件或目录的状态。
检查指定路径的文件或目录的状态。
参数:- path:文件或目录的路径。
- entry:指向结构体 zfs_dirent 的指针,如果文件或目录存在时则填充该结构体。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_statvfs(const char * path, struct fs_statvfs * stat)
检索文件系统卷的统计信息。
返回文件系统卷中总的可用空间。
参数:- path:挂载目录的路径。
- stat:指向结构体 zfs_statvfs 的指针,用于接收文件系统的统计信息。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_register(enum fs_type type, struct fs_file_system_t * fs)
注册一个文件系统。
用虚拟文件系统注册文件系统。
参数:- type:文件系统的类型(如:FS_FATFS)
- fs:指向文件系统的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
int fs_unregister(enum fs_type type, struct fs_file_system_t * fs)
注销文件系统。
用虚拟文件系统注销文件系统。
参数:- type:文件系统的类型(如:FS_FATFS)
- fs:指向文件系统的指针。
返回值:
- 0:成功。
- -ERRNO:错误代码。
4.4. 结构体(struct)
struct fs_mount_t
文件系统挂载信息结构体。#include <fs.h>
成员:- node:fs_mount_list 列表的入口。
- type:文件系统的类型。
- mnt_point:挂载点目录名称(如:“/fatfs”)
- fs_data:指向文件系统特定数据的指针。
- storage_dev:指向后端存储设备的指针。
- mountp_len:挂载点字符串的长度。
- fs:指向挂载点文件系统接口的指针。
struct fs_dirent
结构体用于接收文件或目录信息。#include <fs.h>
用于读取目录项以获取文件或目录信息的函数中。
成员:- dir_entry_type:文件或目录。
- FS_DIR_ENTRY_FILE
- FS_DIR_ENTRY_DIR
- name:文件或目录的名称。
- size:文件的大小。如果是目录则为 0。
- dir_entry_type:文件或目录。
struct fs_statvfs
结构体用于接收卷的统计信息。
用于检索卷中总的可用空间信息。
成员:- f_bsize:最优传递块大小。
- f_frsize:分配单位大小。
- f_blocks:FS 以 f_frsize 为单位的大小。
- f_bfree:空闲块的个数。
struct fs_file_system_t
文件系统接口结构体。 #include <fs.h>
成员:- open:打开一个已存在的文件或创建一个新的文件。
- read:读取数据项的数字节。
- write:写入数字节到数据项。
- lseek:将文件位置移动到文件中的新位置。
- tell:检索在文件中的当前位置。
- truncate:截短文件到新长度。
- sync:刷新打开文件的缓存。
- close:刷新相关流并关闭文件。
- opendir:通过指定路径打开已存在的目录。
- readdir:读取打开目录的目录项。
- closedir:关闭一个打开的目录。
- mount:挂载一个文件系统。
- unmount:卸载一个文件系统。
- unlik:删除指定的文件或目录。
- rename:文件或目录重命名。
- mkdir:使用指定路径创建一个新的目录。
- stat:通过指定路径检查文件或目录的状态。
- statvfs:返回文件系统卷中总的可用空间。
Zephyr_FileSystems相关推荐
最新文章
- 文件系统的两种文件索引模式extent和blockmap
- python numpy模块
- MyBatis中提示:元素类型为 mapper 的内容必须匹配 (cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|de
- XCTF WEB webshell
- JavaWeb学习总结(五十)——文件上传和下载
- raid卡缓存对硬盘性能_Mac Pro 2019加装2.5英寸机械硬盘方案
- ES6_字符串模板以及其使用
- HDU 5157(回文树)
- java命令javac java,使用命令行JAVAC编译Java
- ES6 class关键字 ~ 非常详细
- Java新职篇:使用程序块
- JAVA日志框架概述
- 安卓仿苹果键盘输入法_苹果手机键盘背景图 安卓仿iphone输入法
- 能当「公务员」、服务员,商用服务机器人今年为啥这么火?
- H264 YUV420视频翻转
- 用ipv6校园网访问gg学术
- 斜挎包长度到哪里合适_斜挎包背带一般多长 斜挎包背带太长怎么办
- 搜索引擎使用的10个技巧
- 三位数除以两位数竖式计算没有余数_四年级上册数学三位数除两位数练习题没有余数...
- 压力位和支撑位的理解。