# FatFs - 通用 FAT 文件系统模块

FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。 FatFs 模块的编写符合 ANSI C (C89)，并与磁盘 I/O 层完全分离。 因此它独立于平台。 它可以集成到资源有限的小型微控制器中，例如 8051，PIC，AVR，ARM，Z80，RX 等。此外，还提供用于微型微控制器的 [Petit FatFs](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/FatFs_Petit.md) 模块。

**特性**

* DOS/Windows 兼容的 FAT/exFAT 文件系统。
* 平台独立，移植简单。
* 非常小的程序代码和工作区占用空间。
* 支持多种[配置](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/FatFs_Config_CN.md)选项：
  * ANSI/OEM 或 Unicode 中的长文件名。
  * exFAT 文件系统。
  * RTOS 线程安全。
  * 多个卷（物理驱动器和分区）。
  * 可变的扇区大小。
  * 多个代码页，包括 DBCS。
  * 只读，可选的 API, I/O 缓存等等。

### 应用接口

FatFs 提供了如下对应用的多种文件系统函数。

* 文件访问
  * [f\_open](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_open.md) - 打开/创建文件
  * [f\_close](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_close.md) - 关闭一个已打开的文件
  * [f\_read](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_read.md) - 从一个文件中读取数据
  * [f\_write](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_write.md) - 写数据到一个文件中
  * [f\_lseek](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_lseek.md) - 移动读/写指针（光标），扩展大小
  * [f\_truncate](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_truncate.md) - 截断文件大小
  * [f\_sync](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_sync.md) - 刷新缓存数据
  * [f\_forward](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_forward.md) - 将数据发送到流
  * [f\_expand](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_expand.md) - 为文件分配一个连续的块
  * [f\_gets](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_gets.md) - 读一个字符串
  * [f\_putc](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_putc.md) - 写一个字符
  * [f\_puts](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_puts.md) - 都一个字符串
  * [f\_printf](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_printf.md) - 写一个格式化的字符串
  * [f\_tell](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_tell.md) - 获得当前的读/写指针（光标）。
  * [f\_eof](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_eof.md) - 测试文件结尾
  * [f\_size](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_size.md) - 获取大小
  * [f\_error](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_error.md) - 测试一个错误
* 目录访问
  * [f\_opendir](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_opendir.md) - 打开一个目录
  * [f\_closedir](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_closedir.md) - 关闭一个已打开的目录
  * [f\_readdir](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_readdir.md) - 读取目录成员
  * [f\_findfirst](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_findfirst.md) - 打开目录并读取第一个匹配的成员
  * [f\_findnext](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_findnext.md) - 读取下一个匹配的成员
* 文件与目录管理
  * [f\_stat](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_stat.md) - 检查文件或子目录的存在
  * [f\_unlink](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_unlink.md) - 移除一个文件或子目录
  * [f\_rename](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_rename.md) - 重命名/移动一个文件或子目录
  * [f\_chmod](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_chmod.md) - 改变一个文件或子目录的属性
  * [f\_utime](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_utime.md) - 改变一个文件或子目录的时间戳
  * [f\_mkdir](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_mkdir.md) - 创建一个子目录
  * [f\_chdir](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_chdir.md) - 改变当前目录
  * [f\_chdrive](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_chdrive.md) - 改变当前驱动器
  * [f\_getcwd](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_getcwd.md) - 检索当前目录与驱动器
* 卷管理与系统配置
  * [f\_mount](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_mount.md) - 注册/注销卷的工作区
  * [f\_mkfs](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_mkfs.md) - 在逻辑驱动器上创建一个 FAT 卷
  * [f\_fdisk](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_fdisk.md) - 在物理驱动器上创建逻辑驱动器
  * [f\_getfree](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_getfree.md) - 获取卷的总大小与剩余空间
  * [f\_getlabel](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_getlabel.md) - 获取卷标签
  * [f\_setlabel](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_setlabel.md) - 设置卷标签
  * [f\_setcp](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/f_setcp.md) - 设置活动代码页

### 媒体访问接口

由于 FatFs 模块是独立于平台和存储介质的**文件系统层**，因此它与物理设备完全分离，例如存储卡，硬盘和任何类型的存储设备。 低级设备的控制模块**不是 FatFs 模块的任何部分**，需要由实现者提供。 FatFs 通过如下所示的简单媒体访问接口访问存储设备。 此外，下载中还提供了某些平台的示例实现。 [此处](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/app5.md)提供了用于低级磁盘 I/O 模块的功能检查程序。

* [disk\_status](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/disk_status.md) - 获取设备状态
* [disk\_initialize](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/disk_initialize.md) - 初始化设备
* [disk\_read](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/disk_read.md) - 读一个或多个扇区
* [disk\_write](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/disk_write.md) - 写一个或多个扇区
* [disk\_ioctl](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/disk_ioctl.md) - 控制设备相关函数
* [get\_fattime](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/func/get_fattime.md) - 获取当前时间

### 资源

FatFs模块是一个为教育，研究和开发而开放的免费软件。 您可以使用，修改和/或重新分发个人项目或商业产品，不受您的任何限制。 有关详细信息，请参阅应用笔记。

* 先阅读: [FatFs 模块应用说明](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/FatFs_Read_First_CN.md) (*2019年6月8日*)
* 下载: FatFs R0.13c | 更改日志 | 最新补丁 （*April 13, 2019*）
* 下载: FatFs 多个平台的样例 （*October 14, 2018*）
* 下载: 预览发布
* 交流: [FatFs 用户论坛](http://elm-chan.org/fsw/ff/bd/)
* [微软 FAT32 规范](https://msdn.microsoft.com/en-us/windows/hardware/gg463080.aspx)↗(FAT文件系统上的授权文档)
* FAT文件系统的基础知识
* exFAT文件系统的基础知识
* 如何使用 MMC/SDC
* 玩转 FlashAir 和 FatFs
* [奈米桑的 Blog](http://nemuisan.blog.bai.ne.jp/)↗(STM32F/SPI & SDIO和LPC 4088/SDMMC 的良好实现)
* [来自 Tilen Majerle 的 STM32F4xx 设备上读取带有 FatFs 的 SD 卡](http://stm32f4-discovery.net/2014/07/library-21-read-sd-card-fatfs-stm32f4xx-devices/)↗（STM32F4-Discovery 快速简便的实现）
* [基准测试 1](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/img/rwtest1.png)（ATmega1284/20MHz，MMC 通过 USART 在 SPI，CFC 通过 GPIO）
* [基准测试 2](https://app.gitbook.com/s/-Lnq84rK35jMvfrxoa-a/img/rwtest2.png) (LPC2368/72MHz， MMC 通过 MCI)
* 应用程序的演示影片（此项目位于 ffsample.zip/lpc23xx）


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://fatfs.asicfans.com/master.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
