xuos-web/docs/doc/component/fs.md

270 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 文件系统
## 简介
当前Linux和其他RTOS支持Ext2Ext3Ext4XFSBtrFSF2FSRAMFS等多种文件系统因存储设备的硬件特征及其不同的应用场合用户可以选择不同的文件系统。虚拟文件系统VFS的引入使得这些不同的文件系统可以向外提供统一的编程接口和操作界面。
在物联网领域主要使用的存储设备为FLASH所以可以选择Jffs2等适合FLASH特性的日志型文件系统FATFS由于其同时兼容Linux和Windows选择其作为文件系统便于在“端”、“边”、“云”之间以统一的格式交互和保存数据。Ext4作为业内用户使用较多的文件系统也可以将其轻量级的版本应用于物联网领域。
XiUOS研发计划支持FATFSJffs2LWext4三种文件系统目前XiUOS 1.0版本只支持FATFS。为了增强兼容性和支持VFS的特性XiUOS通过设计IoT-VFS的构件为用户提供了树形的文件组织结构。当前版本的IoT-VFS在功能上保证了FATFS的VFS特性同时允许用户使用统一的VFS的接口来操作设备。IoT-VFS具有以下特性
* 统一采用UNIX风格路径格式目录与文件层级清晰分明
* 面向用户提供POSIX文件接口降低应用程序移植难度
* 可以在任意路径挂载不同文件系统,并且可以便捷地添加对新的文件系统的支持
在IoT-VFS的支持下应用程序开发者无须了解底层文件系统的接口细节只需使用标准POSIX文件接口进行应用开发。对于已有的POSIX应用程序也可以直接进行源代码级别的移植。使用IoT-VFS的应用程序架构如下图所示。
<center>
![fs](./imagesrc/fs.png)
</center>
## 文件系统接口
```c
int xs_MountFilesystem(const char *device_name,
enum xs_FilesystemType fs_type, const char *path);
```
该函数用于将指定设备上的物理文件系统挂载到指定路径若挂载成功返回0失败返回对应错误码。
| 参数 | 描述 |
| --- | --- |
| device_name | 待挂载的设备名 |
| fs_type | 设备上的物理文件系统类型目前只支持FSTYPE_FATFS |
| path | 挂载路径 |
```c
int xs_UnmountFileSystem(const char *path);
```
该函数用于卸载指定路径上挂载的文件系统若卸载成功返回0失败返回对应错误码。
| 参数 | 描述 |
| --- | --- |
| path | 待卸载的路径 |
## POSIX文件接口
```c
int open(const char *path, int flags, ...);
```
该函数用于打开一个文件。若文件打开成功则返回该文件的描述符(非负),后续读写该文件由该描述符标识,若不成功则返回-1此时errno会被置为对应错误码。在打开文件时可以指定打开选项即flags参数。可选的选项有打开时截断文件O_TRUNC和向末尾写入O_APPEND
| 参数 | 描述 |
| --- | --- |
| path | 打开文件的路径 |
| flags | 打开选项 |
```c
int close(int fd);
```
该函数用于关闭一个已打开的文件。若文件关闭成功则返回0若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| fd | 待关闭文件描述符 |
```c
int read(int fd, void *buf, size_t len);
```
该函数用于从文件读取数据。若读取成功则返回读取到的字节数,若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| fd | 待读取文件描述符 |
| buf | 存放读取数据的缓冲区首地址 |
| len | 缓冲区长度,单位为字节 |
```c
int write(int fd, const void *buf, size_t len);
```
该函数用于向文件写入数据。若写入成功则返回读取到的字节数,若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| fd | 待写入文件描述符 |
| buf | 存放写入数据的缓冲区首地址 |
| len | 缓冲区长度,单位为字节 |
```c
off_t lseek(int fd, off_t offset, int whence);
```
该函数用于重定位文件读写指针。若重定位成功则返回新的读写指针位置,即距离文件起始处的字节数,若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| fd | 待重定位的文件描述符 |
| offset | 新的文件读写指针位置 |
| whence | offset参数的参照位置可以为文件起始SEEK_SET、当前位置SEEK_CUR、文件末尾SEEK_END |
```c
int rename(const char *from, const char *to);
```
该函数用于重命名文件。若重命名成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| from | 原文件路径 |
| to | 新文件路径,若与原路径属于不同目录则文件会被移动 |
```c
int unlink(const char *path);
```
该函数用于删除一个文件。若删除成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| path | 待删除文件路径 |
```c
int stat(const char *path, struct stat *buf);
```
该函数用于获取文件的元数据。stat结构与POSIX定义相同。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| path | 待获取元数据的文件路径 |
| buf | 一个stat结构实例指针用于存储元数据 |
```c
int fstat(int fd, struct stat *buf);
```
该函数用于获取文件的元数据。stat结构与POSIX定义相同。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| fd | 待获取元数据的文件描述符 |
| buf | 一个stat结构实例指针用于存储元数据 |
```c
int fsync(int fd);
```
该函数用于将指定文件数据写回存储设备从而防止系统掉电数据丢失。若写回成功则返回0失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| fd | 待写回文件描述符 |
```c
int ftruncate(int fd, off_t length);
```
该函数用于将文件截断至指定长度。若截断成功则返回0失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| fd | 待截断文件描述符 |
| length | 截断后的长度 |
```c
int mkdir(const char *path, mode_t mode);
```
该函数用于创建一个目录。若创建成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| path | 待创建目录的路径 |
| mode | 目前该参数无用 |
```c
DIR *opendir(const char *path);
```
该函数用于打开一个目录。若打开成功则返回一个目录句柄若失败则返回XS_NULL。
| 参数 | 描述 |
| --- | --- |
| path | 待打开目录的路径 |
```c
int closedir(DIR *dirp);
```
该函数用于关闭一个已打开的目录。若关闭成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| dirp | 待关闭目录句柄 |
```c
struct dirent *readdir(DIR *dirp);
```
该函数用于读取目录的目录项。目录项由dirent结构表示目前该结构仅包含文件或目录的类型d_kind与名称d_name。若读取成功则返回一个dirent指针若读取失败则返回XS_NULL此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| dirp | 待读取目录句柄 |
```c
int rmdir(const char *path);
```
该函数用于删除一个目录。若删除成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| path | 待删除目录的路径 |
```c
int chdir(const char *path);
```
该函数用于切换当前工作目录。若切换成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| path | 新的工作目录路径 |
```c
char *getcwd(char *buf, size_t size);
```
该函数用于获取当前的工作目录。若获取成功则返回工作目录字符串与buf参数相同若失败则返回 XS_NULL此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| buf | 用于存储工作目录字符串的缓冲区首地址 |
| size | 缓冲区大小 |
```c
void rewinddir(DIR *dirp);
```
该函数用于重置目录的读取位置即下一次readdir将返回目录的第一个目录项。
| 参数 | 描述 |
| --- | --- |
| dirp | 待重置读取位置的目录句柄 |
```c
long telldir(DIR *dirp);
```
该函数用于获取目录的读取位置即下一个readdir返回目录项的位置。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| dirp | 待获取读取位置的目录句柄 |
```c
void seekdir(DIR *dirp, off_t offset);
```
该函数用于设置目录的读取位置即下一个readdir返回目录项的位置。若设置成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
| dirp | 待设置读取位置的目录句柄 |
| offset | 新的读取位置应为某次telldir的返回值 |