FatFS: f_findfirst возвращает строку, которая не соответствует найденному файлу - PullRequest
0 голосов
/ 11 ноября 2019

Я использую библиотеку FatFs для создания и управления файловой системой на SD-карте. Цель состоит в том, чтобы определить файл, содержащий прошивку для загрузчика, чтобы обновить (или нет) устройство.

Ниже описана процедура, которую я придерживаюсь:

DIR  directory;
FILINFO filinfo;

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

Насколько я понимаю,первый файл, начинающийся с "firmware_", должен быть идентифицирован, а информация сохранена в filinfo. Это работает, но когда я пытаюсь извлечь имя из filinfo.fname, имя, которое было извлечено, выглядит следующим образом: "\0IRMWA~1.BIN".

Я не знаю причину, по которой имя файлаизвлечено в этом формате. Идея состояла бы в том, чтобы позже взять вторую часть файла: «firmware_01_01_01» и выполнить преобразование char в int для обработки номера версии, но я не могу извлечь полную строку имени файла.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019
  1. Всегда читайте документацию.

Описание

После открытия каталога, указанного путем, он начинает поиск в каталоге элементов симя, указанное в шаблоне. Если первый элемент найден, информация об объекте сохраняется в информационной структуре файла fno.

Соответствующий шаблон может содержать символы подстановки (? И *). А? соответствует любому символу, а * соответствует любой строке длиной от нуля или более. Когда включена поддержка длинного имени файла, проверяется только fname [] в FF_USE_FIND == 1, а altname [] проверяется в FF_USE_FIND == 2. В этой редакции ниже приведены некоторые различия между 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.

>

QuickInfo

Это функция-обертка функций f_opendir и f_readdir. Доступно, когда FF_USE_FIND> = 1 и FF_FS_MINIMIZE <= 1. Примеры </p>

/* 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); 
    } 
Затем вы узнаете, что вам нужно использовать:
  • подстановочные знаки
  • вам нужно проверить возвращаемое значение функции
  • , если первый символ имени файла равен нулю -это означает, что файл не найден
0 голосов
/ 11 ноября 2019

Я использовал длинное имя файла (LFN), которое было активировано в файле ffconf.h (файл опций, который поставляется с FatFs). Проблема заключалась в том, что я использовал filinfo.fname, что относится к структуре имени файла 8.3 (схема короткого именования).

Если LFN активирован, поля lfname и lfsize в структуре FILINFO активны. Эти два поля являются указателем на массив символов, а также на размер. Оба поля должны быть инициализированы перед их использованием следующим образом:

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

...