FatFs目录访问接口中文版

发布于:2022-11-28 ⋅ 阅读:(256) ⋅ 点赞:(0)

▼我是阿荣,关注我,在技术路上一起精进!▼

目录访问

f_opendir - 打开目录

函数原型

FRESULT f_opendir (
  DIR* dp,           /* [OUT] Pointer to the directory object structure */
  const TCHAR* path  /* [IN] Directory name */
);

形参
dp
指向空白目录对象的指针,以创建新目录对象。
path
指向以NULL结尾的字符串的指针,该字符串指定要打开的目录名。
返回值
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_PATH, FR_INVALID_NAME, FR_INVALID_OBJECT, FR_INVALID_DRIVE, FR_NOT_ENABLED, FR_NO_FILESYSTEM, FR_TIMEOUT, FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES
描述
f_opendir函数打开现有目录,并为后续f_readdir函数创建目录对象。

f_closedir - 关闭打开的目录

函数原型

FRESULT f_closedir (
  DIR* dp     /* [IN] Pointer to the directory object */
);

形参
dp
指向要关闭的已打开目录对象结构的指针。
返回值
FR_OK, FR_INT_ERR, FR_INVALID_OBJECT, FR_TIMEOUT
描述
f_closedir函数关闭打开的目录对象。函数成功后,目录对象不再有效,可以将其丢弃。
请注意,如果未启用FF_FS_LOCK选项,也可以在不使用此过程的情况下丢弃目录对象。但是,出于将来的兼容性考虑,不建议这样使用。

f_readdir - 读取目录项

函数原型

FRESULT f_readdir (
  DIR* dp,      /* [IN] Directory object */
  FILINFO* fno  /* [OUT] File information structure */
);
FRESULT f_rewinddir (
  DIR* dp       /* [IN] Directory object */
);

形参
dp
指向打开目录对象的指针。
fno
指向文件信息结构的指针,用于存储有关读取项的信息。空指针倒带目录的读取索引。
返回值
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE
描述
f_readdir函数从打开的目录中读取一个目录项,即关于对象的信息。可以通过f_readdir函数调用顺序读取目录中的项。当目录中的所有项都已读取且没有要读取的项时,将在fno->fname[]中存储一个空字符串,且不会出现任何错误。当给fno一个空指针时,目录对象的读取索引被倒带。f_rewinddir函数作为宏实现。

#define f_rewinddir(dp) f_readdir((dp), 0)

启用LFN时,将在文件信息结构中定义一个成员altname[],以存储对象的短文件名。如果由于下列原因无法访问长文件名,则短文件名将存储到fname[]中,而altname[]具有空字符串。

  • 该项没有LFN。(不适用于exFAT卷)
  • FF_MAX_LFN不足以处理LFN。(不是FF_MAX_LFN==255的情况)
  • FF_LFN_BUF不足以存储LFN。
  • LFN包含当前CP中未定义的某些字符。(FF_LFN_UNICODE!=0中不是这种情况)

exFAT卷中的读取目录存在问题。exFAT不支持短文件名。这意味着在上述条件下不能返回任何名称。如果是这种情况,则“?”作为文件名返回,以指示对象不可访问。要避免此问题,请配置FatFs FF_LFN_UNICODE!=0和FF_MAX_LFN==255以支持LFN规范的全部功能。
FAT卷子目录中的点条目(“.”和“.”)将被过滤掉,它们将永远不会出现在读取项中,因为exFAT在子目录中缺少点条目。

f_findfirst - 打开目录并读取匹配的第一项

函数原型

FRESULT f_findfirst (
  DIR* dp,              /* [OUT] Poninter to the directory object */
  FILINFO* fno,         /* [OUT] Pointer to the file information structure */
  const TCHAR* path,    /* [IN] Pointer to the directory name to be opened */
  const TCHAR* pattern  /* [IN] Pointer to the matching pattern string */
);

形参
dp
指向空白目录对象的指针。
fno
指向文件信息结构的指针,用于存储有关找到的项的信息。
path
指向以NULL结尾的字符串的指针,该字符串指定要打开的目录名。
pattern
指向以NULL结尾的字符串的指针,该字符串指定要搜索的名称匹配模式。后续的f_findnext函数也会引用该字符串,因此在后续函数调用时,该字符串必须有效。
返回值
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_PATH, FR_INVALID_NAME, FR_INVALID_OBJECT, FR_INVALID_DRIVE, FR_NOT_ENABLED, FR_NO_FILESYSTEM, FR_TIMEOUT, FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES
描述
在path指定的目录可以打开之后,它开始搜索目录中具有path指定的匹配模式的项。如果找到第一个项目,有关该项目的信息将存储到文件信息结构fno中。如果未找到,则fno->fname[]具有空字符串。

匹配的模式字符串可以包含通配符。例如:

  • ?:任何角色的角色。
  • ???:长度为三个字符的任意字符串。
  • *:长度为零或更长的任意字符串。
  • ???*:长度为四个字符或更长的任意字符串。

由于匹配算法使用递归,因此匹配模式中的通配符数量限制为四个,以限制堆栈的使用。任何具有过多通配符的模式都与任何名称不匹配。在LFN配置中,当FF_USE_FIND == 1时,仅测试fname[],当FF_USE_FIND == 2时,也测试altname[]。FATF和标准系统在匹配条件方面存在以下差异。
“**”在标准系统中,当它匹配任何带有或不带扩展名的名称时,它从不匹配任何不带扩展名的名称。
在标准系统中,任何以点结尾的模式都不会与任何名称匹配,而与没有扩展名的名称匹配。
当使用ANSI/OEM代码API启用LFN时,DBCS扩展字符会区分大小写进行比较。

示例

/* Search a directory for objects and display it */

void find_image_file (void)
{
    FRESULT fr;     /* Return value */
    DIR dj;         /* Directory object */
    FILINFO fno;    /* File information */

    fr = f_findfirst(&dj, &fno, "", "????????.JPG"); /* Start to search for photo files */

    while (fr == FR_OK && fno.fname[0]) {         /* Repeat while an item is found */
        printf("%s\n", fno.fname);                /* Print the object name */
        fr = f_findnext(&dj, &fno);               /* Search for next item */
    }

    f_closedir(&dj);
}

f_findnext - 读取下一个匹配项

函数原型

FRESULT f_findnext (
  DIR* dp,              /* [IN] Poninter to the directory object */
  FILINFO* fno          /* [OUT] Pointer to the file information structure */
);

形参
dp
指向由f_findfirst函数创建的有效目录对象的指针。
fno
指向文件信息结构的指针,用于存储有关找到的目录项的信息。
返回值
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE
描述
它将从上一次调用f_findfirst或f_findnext函数继续搜索。如果找到,有关对象的信息将存储到文件信息结构中。如果没有要读取的项,则将在fno->fname[]中返回空字符串。

本文含有隐藏内容,请 开通VIP 后查看