Функция 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
Комментарии
if (fno.fname[0] == '.')
continue; /* Игнорирование элемента 'точка' */
лучше сделать проверку по fsize, т.к. он для директорий всегда равен 0.
RSS лента комментариев этой записи