Программирование Файловые системы Библиотека FatFS: f_readdir Fri, December 06 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Библиотека FatFS: f_readdir Печать
Добавил(а) microsin   

f_readdir

Функция f_readdir читает содержимое директории (папки).

FRESULT f_readdir (
  DIR* DirObject,    /* Указатель на открытый объект директории */
  FILINFO* FileInfo  /* Указатель на информационную структуру файла */
);
Параметры
DirObject
Указатель на открытый объект директории.
FileInfo
Указатель на файловую информационную структуру, где будет сохранена информация о текущем элементе директории.
Возвращаемые значения

FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE


Описание

Функция f_readdir последовательно, друг за другом читает элементы (файлы и папки), находящиеся в директории DirObject. Все элементы директории могут быть прочитаны повторяющимися вызовами f_readdir. Когда будут прочитаны все элементы в директории, функция вернет пустую ASCIIZ-строку в поле fname[] (т. е. fname[0]==0) без какой-либо ошибки. Когда в качестве параметра FileInfo указан null указатель, то позиция чтения директории отматывается на начало.

Когда включена опция LFN (разрешены длинные имена), поля lfname и lfsize в FileInfo должны быть предварительно инициализированы до вызова f_readdir. Поле lfname является указателем на буфер, в котором будет сохранена строка с длинным именем файла. Поле lfsize содержит размер для буфера строки, указанный в единицах TCHAR. Если размер буфера чтения или рабочего буфера LFN недостаточен для длинного имени, то будет возвращена null строка в буфере LFN. Если длинное имя содержит любой символ, который не может быть сконвертирован в код OEM, будет возвращена null строка, если не включена конфигурация Unicode API. Когда lfname является NULL, то длинное имя не будет возвращено. Когда у объекта нет длинного имени, в буфере короткого имени SFN могут содержаться некоторые маленькие прописные буквы. Когда разрешено использование относительных имен пути relative path (_FS_RPATH == 1), элементы директории "." и ".." не будут отфильтрованы и будут появляться как элементы директории при вызовах f_readdir.

Внимание: если используется длинные имена файлов (задано #define _USE_LFN 1), то поля lfname и lfsize обязательно должны быть инициализированы на валидный буфер в памяти, иначе поведение кода библиотеки FatFS будет непредсказуемым. Кроме того, для доступа к файлам даже при включенных длинных именах нужно использовать короткое имя файла (поле fname), так как если имя файла по размеру меньше 8.3, то длинное имя будет пустым (0 == strlen(lfname)).


Краткая информация (QuickInfo)

Функция доступна, если задано _FS_MINIMIZE < = 1.


Пример кода
FRESULT scan_files (
    char* path  /* Начальная точка сканирования 
(используется также как рабочая область) */
) { FRESULT res; FILINFO fno; DIR dir; int i; char *fn; /* Подразумевается, что конфигурация без Unicode. */ #if _USE_LFN static char lfn[_MAX_LFN + 1]; fno.lfname = lfn; fno.lfsize = sizeof(lfn); #endif res = f_opendir(&dir, path); /* Открытие директории */ if (res == FR_OK)
{ i = strlen(path); for (;;)
{ res = f_readdir(&dir, &fno); /* Чтение объекта директории */ if (res != FR_OK || fno.fname[0] == 0)
break; /* Останов цикла при ошибке или при достижении
конца списка директории */
if (fno.fname[0] == '.')
continue; /* Игнорирование элемента 'точка' */ #if _USE_LFN fn = *fno.lfname ? fno.lfname : fno.fname; #else fn = fno.fname; #endif if (fno.fattrib & AM_DIR)
{ /* Это директория */ sprintf(&path[i], "/%s", fn); res = scan_files(path); if (res != FR_OK) break; path[i] = 0; }
else
{ /* Это файл. */ printf("%s/%s\n", path, fn); } } } return res; }
См. также

f_opendir, f_stat, FILINFO, DIR

[Ссылки]

1. f_readdir - Read a directory item (оригинал статьи на английском языке).

 

Комментарии  

 
0 #1 Алексей 16.10.2012 10:38
я так понимаю, что директории, в имени которых есть точка, будут отброшены?

if (fno.fname[0] == '.')
continue; /* Игнорирование элемента 'точка' */

лучше сделать проверку по fsize, т.к. он для директорий всегда равен 0.
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page