0

我正在使用 FatFs 库在 SD 卡上创建和管理文件系统。目标是识别包含固件的文件,以便引导加载程序更新(或不更新)设备。

我遵循的程序如下:

DIR  directory;
FILINFO filinfo;

f_findfirst(&directory, &filinfo, "", "firmware_");

"firmware_"据我了解,应识别以开头的第一个文件,并将信息存储在filinfo. 这确实有效,但是当我尝试从filinfo.fname已提取的名称中提取名称时,会出现以下情况:"\0IRMWA~1.BIN"

不知道文件的命名为什么会提取成这种格式。这个想法是稍后获取文件的第二部分:“ firmware_01_01_01”并执行 char 到 int 的转换以处理版本号,但我无法提取文件名的完整字符串。

4

3 回答 3

2

我有一个类似的问题。这是我的代码。希望你觉得这有帮助

#define FW_FOLDER               "fw"
#define FW_PATH                 "0:/" FW_FOLDER
#define FW_BIN                  "*.bin"

FRESULT res;
DIR dir;
FILINFO fno;
static char fw_path[128];

// Find first item
res = f_findfirst(&dir, &fno, FW_PATH, FW_BIN);

// Create directory (optional)
if (res == FR_NO_PATH)
{
    printf("Creating %s directory!\n", FW_FOLDER);
    f_mkdir(FW_FOLDER);
}

// Repeat until proper item is found
while (res == FR_OK)
{
    // Make sure file name is valid
    if (fno.fname[0] == 0)
        break;
    
    // Debugging
    printf("Scanning: %s\n", fno.fname);

    // Make sure it is not a directory
    if (!(fno.fattrib & AM_DIR))
    {            
        // Success!
        printf("Found: %s\n", fno.fname);
        
        // Construct file path
        sprintf(fw_path, "%s/%s", FW_PATH, fno.fname);
        
        break;
    }
    
    // Move to the next one
    res = f_findnext(&dir, &fno);
}

// Close directory
f_closedir(&dir);

是的,您需要FF_USE_FIND == 1在 fatfs 库中启用。如果你决定使用2forFF_USE_FIND你必须检查altname作为fno.

另外,我最终不得不将文件验证更新到这个片段

// Make sure file name is alpha numeric
if (!isalnum(fat_fno.fname[0]))
    break;
于 2021-01-08T18:27:43.100 回答
1
  1. 始终阅读文档。

描述

在 path 指定的目录可以打开后,它开始在目录中搜索具有 pattern 指定名称的项目。如果找到第一项,则将有关对象的信息存储到文件信息结构 fno 中。

匹配模式可以包含通配符(? 和 *)。一个 ?匹配任意字符,* 匹配长度为零或更长的任意字符串。启用长文件名支持后,仅在 FF_USE_FIND == 1 处测试 fname[],在 FF_USE_FIND == 2 处测试 altname[]。在此版本中,FatFs 与标准系统在匹配方面存在如下一些差异健康)状况。

- "*.*" never matches any name without extension while it matches any name with or without extension at the standard systems.
- Any pattern terminated with a period never matches any name while it matches the name without extensiton at the standard systems.
- DBCS extended characters are compared in case-sensitive at LFN with ANSI/OEM API.

>

快速信息

这是 f_opendir 和 f_readdir 函数的包装函数。当 FF_USE_FIND >= 1 和 FF_FS_MINIMIZE <= 1 时可用。示例

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

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

    fr = f_findfirst(&dj, &fno, "", "dsc*.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);                /* Display the object name */
        fr = f_findnext(&dj, &fno);               /* Search for next item */
    }

    f_closedir(&dj); 
    } 
  1. 然后您将了解到您需要使用:
    • 通配符
    • 你需要检查函数返回值
    • 如果文件名的第一个字符为零 - 这意味着没有找到文件
于 2019-11-11T10:42:23.797 回答
0

我使用的是在 ffconf.h 文件(FatFs 附带的选项文件)中激活的长文件名 (LFN)。问题是我使用filinfo.fname的是 8.3 文件名结构(短命名方案)。

如果 LFN 被激活,则结构中的字段lfname和字段都处于活动状态。这两个字段是指向 char 数组的指针以及大小。这两个字段必须在使用它们之前进行初始化,如下所示: lfsizeFILINFO

static char lfn[_MAX_LFN + 1] 
//MAX_LFN is defined in ffconf.h and is 255, maximum value for LFN
filinfo.lfname = lfn;
filinfo.lfsize = sizeof lfn;
f_findfirst(&directory, &filinfo, "", "firmware_*.bin");
(...)

可以在此处阅读还显示示例的文档。

当启用LFN 功能时,文件信息结构中的lfname 和lfsize 必须在使用f_readdir 函数之前初始化为有效值。lfname 是指向字符串缓冲区以返回长文件名的指针。lfsize 是字符串缓冲区的大小,以 TCHAR 为单位。

lfname 和 lfsize 对 f_findfirst 的作用与对 f_readdir 的作用相同。

这是 f_opendir 和 f_readdir 的包装函数

于 2019-11-11T12:23:45.890 回答