# 文件系统 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 功能概述 文件系统是指文件和对文件进行操作和管理的软件的集合。文件系统实现了存储空间管理、构造文件结构、提供访问文件的操作接口。使用文件系统存储方式可以方便进行文件的增、删、查、改。 本章主要介绍UniRTOS虚拟文件系统(VFS)的功能特性、API使用方法及典型应用示例,旨在帮助开发者快速掌握文件系统操作能力的集成与调试,确保设备在各种存储介质和平台下稳定可靠运行。 ## VFS VFS(Virtual File System,虚拟文件系统)是操作系统中承上启下的关键抽象层——它对上层应用提供统一的POSIX风格文件操作接口(open/read/write/close等),对下层屏蔽不同文件系统实现的差异。各存储分区(如 */user*、*/fota*、*/data*)在系统启动阶段已由平台完成挂载,应用代码只需使用标准路径即可操作文件,无需关心底层是何种存储介质。UniRTOS的VFS实现由 *qosa_vfs* 系列接口承载,是文件系统栈的核心枢纽。 ### UniRTOS VFS的核心能力 UniRTOS VFS的核心能力包括: - 统一文件操作:提供 *open/close/read/write/lseek/stat/truncate* 等标准POSIX语义接口,应用层使用系统路径(如 */user/config.json*)访问已挂载分区中的文件,降低有嵌入式Linux开发经验者的学习成本; - 完整目录管理:支持目录的创建、删除、遍历、递归操作,以及工作目录切换和路径规范化; - 文件系统信息查询:获取挂载点列表、文件系统容量、剩余空间、块大小等统计信息,为存储空间监控和预警提供数据基础; - 运行时挂载管理:支持文件系统的运行时卸载和只读重新挂载,满足FOTA升级、安全模式切换等动态场景需求。 ### 典型高频应用场景 典型高频应用场景包括: - 配置文件管理:设备首次上电时通过 *qosa_vfs_open()* 检查配置文件是否存在,不存在则创建默认配置;运行期间通过 *qosa_vfs_read()* 和 *qosa_vfs_write()* 读写配置参数; - 日志文件记录:通过 *qosa_vfs_open()* 创建日志文件,配合 *qosa_vfs_lseek()* 和 *qosa_vfs_ftruncate()* 实现按大小滚动覆写,避免日志文件无限增长耗尽存储空间; - FOTA升级流程:通过 *qosa_vfs_statvfs()* 校验FOTA分区容量,使用辅助函数 *qosa_vfs_file_write()* 将固件包一次性写入,升级后卸载旧分区重新挂载新固件; - 存储空间监控:定期调用 *qosa_vfs_statvfs()* 或 *qosa_vfs_dir_total_size()* 查询存储使用情况,低于阈值时触发清理策略或上报告警; - 工厂文件保护:利用 *qosa_vfs_remount()* 将配置分区切换为只读模式,防止运行期间误写关键出厂参数。 # 文件系统API ## 头文件 *qosa_virtual_file.h* ## 函数概览 ### 文件操作 | **函数** | **说明** | | --- | --- | | *qosa_vfs_creat()* | 创建文件 | | *qosa_vfs_open()* | 打开文件(可创建) | | *qosa_vfs_close()* | 关闭文件描述符 | | *qosa_vfs_read()* | 读取文件数据 | | *qosa_vfs_write()* | 写入文件数据 | | *qosa_vfs_lseek()* | 设置文件读写偏移 | | *qosa_vfs_fstat()* | 通过文件描述符获取文件状态 | | *qosa_vfs_stat()* | 通过文件路径获取文件状态 | | *qosa_vfs_truncate()* | 通过路径截断文件到指定长度 | | *qosa_vfs_ftruncate()* | 通过文件描述符截断文件到指定长度 | | *qosa_vfs_unlink()* | 删除文件 | | *qosa_vfs_rename()* | 重命名或移动文件 | | *qosa_vfs_fsync()* | 将文件数据同步到存储设备 | | *qosa_vfs_file_size()* | 获取文件大小(辅助函数) | | *qosa_vfs_file_read()* | 一次性读取文件(辅助函数) | | *qosa_vfs_file_write()* | 一次性写入文件(辅助函数) | ### 目录操作 | **函数** | **说明** | | --- | --- | | *qosa_vfs_mkdir()* | 创建目录 | | *qosa_vfs_rmdir()* | 删除空目录 | | *qosa_vfs_opendir()* | 打开目录流 | | *qosa_vfs_readdir()* | 读取目录条目 | | *qosa_vfs_readdir_r()* | 读取目录条目(线程安全版本) | | *qosa_vfs_closedir()* | 关闭目录流 | | *qosa_vfs_telldir()* | 获取目录流当前位置 | | *qosa_vfs_seekdir()* | 设置目录流读取位置 | | *qosa_vfs_rewinddir()* | 重置目录流到起始位置 | | *qosa_vfs_mkpath()* | 递归创建多级目录 | | *qosa_vfs_mkfilepath()* | 递归创建文件所在目录 | | *qosa_vfs_rmchildren()* | 删除目录下所有子文件和子目录 | | *qosa_vfs_rmdir_recursive()* | 递归删除目录及其内容 | | *qosa_vfs_chdir()* | 切换工作目录 | | *qosa_vfs_getcwd()* | 获取当前工作目录 | ### 文件系统管理 | **函数** | **说明** | | --- | --- | | *qosa_vfs_statvfs()* | 通过路径获取文件系统统计信息 | | *qosa_vfs_fstatvfs()* | 通过文件描述符获取文件系统统计信息 | | *qosa_vfs_mount_count()* | 获取已挂载文件系统数量 | | *qosa_vfs_mount_points()* | 获取已挂载文件系统挂载点列表 | | *qosa_vfs_umount()* | 卸载文件系统 | | *qosa_vfs_remount()* | 重新挂载文件系统 | | *qosa_vfs_umount_all()* | 卸载所有已挂载文件系统 | | *qosa_vfs_dir_total_size()* | 获取目录下文件总大小 | | *qosa_vfs_realpath()* | 获取规范化绝对路径 | | *qosa_vfs_sync()* | 将文件系统缓冲区数据刷入磁盘 | ## 函数详解 ### qosa_vfs_creat - **功能描述** 创建文件,等效于以 *QOSA_VFS_O_WRONLY | QOSA_VFS_O_CREAT | QOSA_VFS_O_TRUNC* 方式打开文件。 - **函数原型** ```c qosa_int32_t qosa_vfs_creat(const char *path, qosa_int32_t mode) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径;必须为绝对路径 | | *mode* | 输入 | qosa_int32_t | 文件权限模式 | - **返回值说明** 非负值:函数执行成功,返回文件描述符 *-1*:函数执行失败 ### qosa_vfs_open - **功能描述** 打开文件,支持创建不存在的文件。 - **函数原型** ```c qosa_int32_t qosa_vfs_open(const char *path, qosa_int32_t flags) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径;必须为绝对路径 | | *flags* | 输入 | qosa_int32_t | 文件打开标志;支持 *QOSA_VFS_O_RDONLY*、*QOSA_VFS_O_WRONLY*、*QOSA_VFS_O_RDWR* 等,可与 *QOSA_VFS_O_CREAT*、*QOSA_VFS_O_TRUNC* 等标志按位或组合;详见 [文件打开标志](#文件打开标志) | - **返回值说明** 非负值:函数执行成功,返回文件描述符 *-1*:函数执行失败 ### qosa_vfs_close - **功能描述** 关闭已打开的文件描述符,释放相关资源。 - **函数原型** ```c qosa_int32_t qosa_vfs_close(qosa_int32_t fd) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 待关闭的文件描述符 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_read - **功能描述** 从已打开的文件描述符中读取数据。 - **函数原型** ```c qosa_ssize_t qosa_vfs_read(qosa_int32_t fd, void *buf, qosa_size_t count) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 文件描述符 | | *buf* | 输出 | void * | 数据读取缓冲区 | | *count* | 输入 | qosa_size_t | 期望读取的字节数 | - **返回值说明** 非负值:函数执行成功,返回实际读取的字节数 *-1*:函数执行失败 ### qosa_vfs_write - **功能描述** 向已打开的文件描述符写入数据。 - **函数原型** ```c qosa_ssize_t qosa_vfs_write(qosa_int32_t fd, const void *buf, qosa_size_t count) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 文件描述符 | | *buf* | 输入 | const void * | 待写入数据缓冲区 | | *count* | 输入 | qosa_size_t | 期望写入的字节数 | - **返回值说明** 非负值:函数执行成功,返回实际写入的字节数 *-1*:函数执行失败 ### qosa_vfs_lseek - **功能描述** 重新定位文件读写偏移量。 - **函数原型** ```c qosa_int64_t qosa_vfs_lseek(qosa_int32_t fd, qosa_int64_t offset, qosa_int32_t whence) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 文件描述符 | | *offset* | 输入 | qosa_int64_t | 偏移量;相对于 *whence* 参数指定的位置 | | *whence* | 输入 | qosa_int32_t | 偏移起始位置
*QOSA_VFS_SEEK_SET*:从文件起始位置偏移
*QOSA_VFS_SEEK_CUR*:从当前位置偏移
*QOSA_VFS_SEEK_END*:从文件末尾位置偏移;详见 [文件偏移标志](#文件偏移标志) | - **返回值说明** 非负值:函数执行成功,返回从文件起始位置计算的新偏移量;单位:字节 *-1*:函数执行失败 ### qosa_vfs_fstat - **功能描述** 通过文件描述符获取文件状态信息。 - **函数原型** ```c qosa_int32_t qosa_vfs_fstat(qosa_int32_t fd, struct qosa_vfs_stat_t *st) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 文件描述符 | | *st* | 输出 | *struct qosa_vfs_stat_t ** | 指向文件状态结构体的指针;详见 [*qosa_vfs_stat_t*](#qosavfsstat_t) | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_stat - **功能描述** 通过文件路径获取文件状态信息。 - **函数原型** ```c qosa_int32_t qosa_vfs_stat(const char *path, struct qosa_vfs_stat_t *st) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径 | | *st* | 输出 | *struct qosa_vfs_stat_t ** | 指向文件状态结构体的指针;详见 [*qosa_vfs_stat_t*](#qosavfsstat_t) | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_truncate - **功能描述** 将指定路径的文件截断到指定长度。若文件长度小于指定长度,文件将被扩展;若大于指定长度,文件将被截断。 - **函数原型** ```c qosa_int32_t qosa_vfs_truncate(const char *path, long length) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径 | | *length* | 输入 | long | 文件截断后的目标长度;单位:字节 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_ftruncate - **功能描述** 通过文件描述符将文件截断到指定长度。 - **函数原型** ```c qosa_int32_t qosa_vfs_ftruncate(qosa_int32_t fd, long length) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 文件描述符 | | *length* | 输入 | long | 文件截断后的目标长度;单位:字节 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_unlink - **功能描述** 删除指定路径的文件。 - **函数原型** ```c qosa_int32_t qosa_vfs_unlink(const char *pathname) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *pathname* | 输入 | const char * | 待删除的文件路径 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_rename - **功能描述** 重命名或移动文件。源路径和目标路径必须在同一个挂载的文件系统上。 - **函数原型** ```c qosa_int32_t qosa_vfs_rename(const char *oldpath, const char *newpath) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *oldpath* | 输入 | const char * | 原文件路径 | | *newpath* | 输入 | const char * | 新文件路径 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 *EXDEV*:源路径和目标路径不在同一个挂载的文件系统上 ### qosa_vfs_fsync - **功能描述** 将文件的内存缓冲区数据同步写入存储设备,确保数据持久化。 - **函数原型** ```c qosa_int32_t qosa_vfs_fsync(qosa_int32_t fd) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 文件描述符 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_file_size - **功能描述** 获取指定路径文件的大小。内部调用 *qosa_vfs_stat()* 获取文件状态并返回文件大小。 - **函数原型** ```c qosa_ssize_t qosa_vfs_file_size(const char *path) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径 | - **返回值说明** 非负值:函数执行成功,返回文件大小;单位:字节 *-1*:函数执行失败 ### qosa_vfs_file_read - **功能描述** 一次性读取整个文件的辅助函数。内部依次调用 *qosa_vfs_open()*、*qosa_vfs_read()* 和 *qosa_vfs_close()* 完成操作。 - **函数原型** ```c qosa_ssize_t qosa_vfs_file_read(const char *path, void *buf, qosa_size_t count) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径 | | *buf* | 输出 | void * | 数据读取缓冲区 | | *count* | 输入 | qosa_size_t | 期望读取的字节数 | - **返回值说明** 非负值:函数执行成功,返回实际读取的字节数 *-1*:函数执行失败 ### qosa_vfs_file_write - **功能描述** 一次性写入整个文件的辅助函数。内部依次调用 *qosa_vfs_open()*、*qosa_vfs_write()* 和 *qosa_vfs_close()* 完成操作。 - **函数原型** ```c qosa_ssize_t qosa_vfs_file_write(const char *path, const void *buf, qosa_size_t count) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径 | | *buf* | 输入 | const void * | 待写入数据缓冲区 | | *count* | 输入 | qosa_size_t | 期望写入的字节数 | - **返回值说明** 非负值:函数执行成功,返回实际写入的字节数 *-1*:函数执行失败 ### qosa_vfs_mkdir - **功能描述** 创建单级目录。 - **函数原型** ```c qosa_int32_t qosa_vfs_mkdir(const char *pathname, qosa_int32_t mode) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *pathname* | 输入 | const char * | 待创建目录路径 | | *mode* | 输入 | qosa_int32_t | 目录权限模式;可能被文件系统实现忽略 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_rmdir - **功能描述** 删除空目录。 - **函数原型** ```c qosa_int32_t qosa_vfs_rmdir(const char *pathname) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *pathname* | 输入 | const char * | 待删除的目录路径 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_opendir - **功能描述** 打开目录流,返回目录句柄用于后续目录遍历操作。 - **函数原型** ```c QOSA_VFS_DIR *qosa_vfs_opendir(const char *name) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *name* | 输入 | const char * | 待打开的目录路径 | - **返回值说明** 非NULL:函数执行成功,返回指向目录流的指针 *NULL*:函数执行失败 ### qosa_vfs_readdir - **功能描述** 读取目录流中的下一个目录条目。 - **函数原型** ```c struct qosa_vfs_dirent_t *qosa_vfs_readdir(QOSA_VFS_DIR *dirp) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *dirp* | 输入 | *QOSA_VFS_DIR ** | 由 *qosa_vfs_opendir()* 返回的目录流指针;详见 [*QOSA_VFS_DIR*](#qosavfsdir) | - **返回值说明** 非NULL:函数执行成功,返回指向目录条目结构体的指针 *NULL*:已到达目录末尾或函数执行失败 ### qosa_vfs_readdir_r - **功能描述** 读取目录流中的下一个目录条目(线程安全版本)。 - **函数原型** ```c qosa_int32_t qosa_vfs_readdir_r(QOSA_VFS_DIR *dirp, struct qosa_vfs_dirent_t *entry, struct qosa_vfs_dirent_t **result) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *dirp* | 输入 | *QOSA_VFS_DIR ** | 由 *qosa_vfs_opendir()* 返回的目录流指针;详见 [*QOSA_VFS_DIR*](#qosavfsdir) | | *entry* | 输出 | *struct qosa_vfs_dirent_t ** | 用于存储读取结果的目录条目缓冲区;详见 [*qosa_vfs_dirent_t*](#qosavfsdirent_t) | | *result* | 输出 | *struct qosa_vfs_dirent_t *** | 指向结果指针;成功时指向 *entry*,到达目录末尾时为 *NULL* | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_closedir - **功能描述** 关闭已打开的目录流,释放相关资源。 - **函数原型** ```c qosa_int32_t qosa_vfs_closedir(QOSA_VFS_DIR *pdir) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *pdir* | 输入 | *QOSA_VFS_DIR ** | 由 *qosa_vfs_opendir()* 返回的目录流指针;详见 [*QOSA_VFS_DIR*](#qosavfsdir) | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_telldir - **功能描述** 获取目录流的当前读取位置。 - **函数原型** ```c long qosa_vfs_telldir(QOSA_VFS_DIR *pdir) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *pdir* | 输入 | *QOSA_VFS_DIR ** | 由 *qosa_vfs_opendir()* 返回的目录流指针;详见 [*QOSA_VFS_DIR*](#qosavfsdir) | - **返回值说明** 非负值:函数执行成功,返回当前目录流位置 *-1*:函数执行失败 ### qosa_vfs_seekdir - **功能描述** 设置目录流中下次 *qosa_vfs_readdir()* 调用的读取位置。 - **函数原型** ```c void qosa_vfs_seekdir(QOSA_VFS_DIR *pdir, long loc) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *pdir* | 输入 | *QOSA_VFS_DIR ** | 由 *qosa_vfs_opendir()* 返回的目录流指针;详见 [*QOSA_VFS_DIR*](#qosavfsdir) | | *loc* | 输入 | long | 目标位置;由 *qosa_vfs_telldir()* 返回 | - **返回值说明** 无 ### qosa_vfs_rewinddir - **功能描述** 将目录流的读取位置重置到起始位置。 - **函数原型** ```c void qosa_vfs_rewinddir(QOSA_VFS_DIR *pdir) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *pdir* | 输入 | *QOSA_VFS_DIR ** | 由 *qosa_vfs_opendir()* 返回的目录流指针;详见 [*QOSA_VFS_DIR*](#qosavfsdir) | - **返回值说明** 无 ### qosa_vfs_mkpath - **功能描述** 递归创建多级目录,自动创建路径中所有不存在的父级目录。 - **函数原型** ```c qosa_int32_t qosa_vfs_mkpath(const char *path, qosa_int32_t mode) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 待创建的多级目录路径 | | *mode* | 输入 | qosa_int32_t | 目录权限模式 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_mkfilepath - **功能描述** 递归创建文件所在的所有父级目录。传入文件路径,自动创建该文件路径中不存在的目录层级。 - **函数原型** ```c qosa_int32_t qosa_vfs_mkfilepath(const char *path, qosa_int32_t mode) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径(函数会创建该路径的父级目录) | | *mode* | 输入 | qosa_int32_t | 目录权限模式 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_rmchildren - **功能描述** 删除指定目录下的所有子文件和子目录,但保留该目录本身。 - **函数原型** ```c qosa_int32_t qosa_vfs_rmchildren(const char *path) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 目标目录路径 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_rmdir_recursive - **功能描述** 递归删除指定目录及其下所有子文件和子目录。 - **函数原型** ```c qosa_int32_t qosa_vfs_rmdir_recursive(const char *path) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 待递归删除的目录路径 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_chdir - **功能描述** 切换当前工作目录。在RTOS系统中工作目录是全局概念,切换工作目录可能影响其他任务,请谨慎使用。 - **函数原型** ```c qosa_int32_t qosa_vfs_chdir(const char *path) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 目标目录路径 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_getcwd - **功能描述** 获取当前工作目录的绝对路径。 - **函数原型** ```c char *qosa_vfs_getcwd(char *buf, qosa_size_t size) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *buf* | 输出 | char * | 用于存储当前工作目录的缓冲区 | | *size* | 输入 | qosa_size_t | 缓冲区大小;单位:字节 | - **返回值说明** 非NULL:函数执行成功,返回当前工作目录路径字符串指针 *NULL*:函数执行失败 ### qosa_vfs_statvfs - **功能描述** 通过文件路径获取文件系统的统计信息,包括总容量、可用空间、块大小等。 - **函数原型** ```c qosa_int32_t qosa_vfs_statvfs(const char *path, struct qosa_vfs_statvfs_t *buf) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件系统中的任意路径 | | *buf* | 输出 | *struct qosa_vfs_statvfs_t ** | 指向文件系统统计信息结构体的指针;详见 [*qosa_vfs_statvfs_t*](#qosavfsstatvfs_t) | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_fstatvfs - **功能描述** 通过已打开的文件描述符获取文件系统的统计信息。 - **函数原型** ```c qosa_int32_t qosa_vfs_fstatvfs(qosa_int32_t fd, struct qosa_vfs_statvfs_t *buf) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 文件描述符 | | *buf* | 输出 | *struct qosa_vfs_statvfs_t ** | 指向文件系统统计信息结构体的指针;详见 [*qosa_vfs_statvfs_t*](#qosavfsstatvfs_t) | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ### qosa_vfs_mount_count - **功能描述** 获取当前系统中已挂载的文件系统数量。 - **函数原型** ```c qosa_int32_t qosa_vfs_mount_count(void) ``` - **参数说明** 无 - **返回值说明** 返回已挂载的文件系统数量 ### qosa_vfs_mount_points - **功能描述** 获取当前系统中所有已挂载文件系统的挂载点路径列表。 - **函数原型** ```c qosa_int32_t qosa_vfs_mount_points(char **mp, qosa_size_t count) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *mp* | 输出 | char ** | 用于存储挂载点路径的字符串数组 | | *count* | 输入 | qosa_size_t | 数组元素数量 | - **返回值说明** 返回实际获取的挂载点数量 ### qosa_vfs_umount - **功能描述** 卸载指定路径所在的文件系统。路径必须为绝对路径,可以是挂载点本身,也可以是挂载点下的任意文件或目录。 - **函数原型** ```c qosa_int32_t qosa_vfs_umount(const char *path) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 文件路径;必须为绝对路径(以'/'开头) | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败(参数无效或没有对应的挂载点) ### qosa_vfs_remount - **功能描述** 以指定标志重新挂载文件系统。仅支持 *QOSA_MS_RDONLY* 只读挂载标志。路径必须为挂载点。 - **函数原型** ```c qosa_int32_t qosa_vfs_remount(const char *path, unsigned flags) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 挂载点路径 | | *flags* | 输入 | unsigned | 挂载标志
*QOSA_MS_RDONLY*:以只读模式重新挂载 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败(路径不是挂载点或文件系统不支持重新挂载) ### qosa_vfs_umount_all - **功能描述** 卸载所有已挂载的文件系统。仅在FDL模式下有效,应用层实现为空函数。 - **函数原型** ```c void qosa_vfs_umount_all(void) ``` - **参数说明** 无 - **返回值说明** 无 ### qosa_vfs_dir_total_size - **功能描述** 递归计算指定目录下所有文件的总大小。 - **函数原型** ```c qosa_int64_t qosa_vfs_dir_total_size(const char *path) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 目录路径 | - **返回值说明** 非负值:函数执行成功,返回目录下所有文件的总大小;单位:字节 *-1*:函数执行失败(参数无效或内存不足) ### qosa_vfs_realpath - **功能描述** 将文件路径转换为规范化的绝对路径,消除路径中的"."和".."等相对引用。 - **函数原型** ```c char *qosa_vfs_realpath(const char *path, char *resolved_path) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *path* | 输入 | const char * | 待解析的文件路径 | | *resolved_path* | 输出 | char * | 用于存储规范化绝对路径的缓冲区 | - **返回值说明** 非NULL:函数执行成功,返回 *resolved_path* 指针 *NULL*:函数执行失败 ### qosa_vfs_sync - **功能描述** 将文件系统缓冲区中的数据强制刷入磁盘。 - **函数原型** ```c qosa_int32_t qosa_vfs_sync(qosa_int32_t fd) ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *fd* | 输入 | qosa_int32_t | 待同步的文件描述符 | - **返回值说明** *0*:函数执行成功 *-1*:函数执行失败 ## 结构体定义 ### qosa_vfs_stat_t 文件状态信息结构体定义如下: ```c struct qosa_vfs_stat_t { qosa_uint64_t st_dev; qosa_uint64_t st_ino; qosa_uint64_t st_mode; qosa_uint64_t st_nlink; qosa_uint64_t st_uid; qosa_uint64_t st_gid; qosa_uint64_t st_rdev; qosa_uint64_t st_size; qosa_uint64_t st_spare1; qosa_uint64_t st_spare2; qosa_uint64_t st_spare3; qosa_uint64_t st_blksize; qosa_uint64_t st_blocks; qosa_uint64_t st_spare4[2]; }; ``` | **成员** | **说明** | | --- | --- | | *st_dev* | 设备ID | | *st_ino* | i-node编号 | | *st_mode* | 文件类型和权限 | | *st_nlink* | 硬链接数量 | | *st_uid* | 所有者用户ID | | *st_gid* | 所有者组ID | | *st_rdev* | 设备ID(若文件为设备文件) | | *st_size* | 文件大小;单位:字节 | | *st_spare1* | 保留字段 | | *st_spare2* | 保留字段 | | *st_spare3* | 保留字段 | | *st_blksize* | I/O操作块大小 | | *st_blocks* | 文件占用的块数 | | *st_spare4* | 保留字段 | ### QOSA_VFS_DIR 目录操作句柄结构体定义如下: ```c typedef struct { qosa_int16_t fs_index; qosa_int16_t _reserved; } QOSA_VFS_DIR; ``` | **成员** | **说明** | | --- | --- | | *fs_index* | 内部文件系统索引标识 | | *_reserved* | 保留字段,用于字节对齐或未来扩展 | ### qosa_vfs_dirent_t 目录条目信息结构体定义如下: ```c struct qosa_vfs_dirent_t { qosa_int32_t d_ino; unsigned char d_type; char d_name[256]; }; ``` | **成员** | **说明** | | --- | --- | | *d_ino* | inode编号;文件系统实现可自定义用途 | | *d_type* | 文件类型标识
*QOSA_VFS_DT_REG*:普通文件
*QOSA_VFS_DT_DIR*:目录;详见 [文件类型标识](#文件类型标识) | | *d_name* | 文件名(不含路径部分);最大256字节 | ### qosa_vfs_statvfs_t 文件系统统计信息结构体定义如下: ```c struct qosa_vfs_statvfs_t { unsigned long f_bsize; unsigned long f_frsize; unsigned long f_blocks; unsigned long f_bfree; unsigned long f_bavail; unsigned long f_files; unsigned long f_ffree; unsigned long f_favail; unsigned long f_fsid; unsigned long f_flag; unsigned long f_namemax; }; ``` | **成员** | **说明** | | --- | --- | | *f_bsize* | 文件系统块大小;单位:字节 | | *f_frsize* | 分片大小;单位:字节 | | *f_blocks* | 文件系统总块数(以 *f_frsize* 为单位) | | *f_bfree* | 文件系统空闲块数 | | *f_bavail* | 非超级用户可用的空闲块数 | | *f_files* | 文件系统中的文件节点总数 | | *f_ffree* | 文件系统中的空闲文件节点数 | | *f_favail* | 可用的文件节点数 | | *f_fsid* | 文件系统ID标识符 | | *f_flag* | 挂载标志 | | *f_namemax* | 文件名最大长度 | ## 宏定义 ### 文件打开标志 ```c #define QOSA_VFS_O_RDONLY #define QOSA_VFS_O_WRONLY #define QOSA_VFS_O_RDWR #define QOSA_VFS_O_CREAT #define QOSA_VFS_O_EXCL #define QOSA_VFS_O_TRUNC #define QOSA_VFS_O_APPEND ``` | **宏名** | **说明** | | --- | --- | | *QOSA_VFS_O_RDONLY* | 只读模式打开文件 | | *QOSA_VFS_O_WRONLY* | 只写模式打开文件 | | *QOSA_VFS_O_RDWR* | 读写模式打开文件,与 *QOSA_VFS_O_RDONLY* 和 *QOSA_VFS_O_WRONLY* 互斥 | | *QOSA_VFS_O_CREAT* | 文件不存在时自动创建 | | *QOSA_VFS_O_EXCL* | 配合 *QOSA_VFS_O_CREAT* 使用,文件已存在时打开失败 | | *QOSA_VFS_O_TRUNC* | 文件存在且以可写模式打开时,清空文件内容,长度置0 | | *QOSA_VFS_O_APPEND* | 写入数据时从文件末尾追加 | ### 文件偏移标志 ```c #define QOSA_VFS_SEEK_SET #define QOSA_VFS_SEEK_CUR #define QOSA_VFS_SEEK_END ``` | **宏名** | **说明** | | --- | --- | | *QOSA_VFS_SEEK_SET* | 从文件起始位置偏移 | | *QOSA_VFS_SEEK_CUR* | 从当前读写位置偏移 | | *QOSA_VFS_SEEK_END* | 从文件末尾位置偏移 | ### 文件类型标识 ```c #define QOSA_VFS_DT_DIR 4 #define QOSA_VFS_DT_REG 8 ``` | **宏名** | **值** | **说明** | | --- | --- | --- | | *QOSA_VFS_DT_DIR* | 4 | 目录 | | *QOSA_VFS_DT_REG* | 8 | 普通文件 | ### 路径长度限制 ```c #define QOSA_VFS_PATH_MAX 192 ``` | **宏名** | **值** | **说明** | | --- | --- | --- | | *QOSA_VFS_PATH_MAX* | 192 | 最大绝对文件路径长度(含挂载点和终止符\0) | # 应用逻辑流程图 ## 文件操作流程 ```{figure} images/board_FQgkwU87YhksfxbQarVcEctkncc.jpg :align: center :alt: image ``` ## 目录操作流程 ```{figure} images/board_E5C5ww83FhejhqbO3Kyczv1mn6e.jpg :align: center :alt: image ``` # 示例代码 完整示例代码请查看 [https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/system/vfs/vfs.c]( )