2021-07-12 06:43 AM
Hi,
is it possibility to show a list of files and folders with the fatfs library?
Like "ls" in the console.
Solved! Go to Solution.
2021-07-12 10:20 AM
The FatFs library provides you with the means to implement this, but not the code, although you might find some if you look.
Typically a problem that can be solved via recursive, or queued linear, traversal
For a simple single level
puts("Display Directory");
{
DIR dir;
char *path;
UINT BytesWritten;
char string[128];
path = ""; // where you want to list
res = f_opendir(&dir, path);
#ifdef DBG
if (res != FR_OK)
printf("res = %d f_opendir\n", res);
#endif
if (res == FR_OK)
{
while(1)
{
FILINFO fno;
res = f_readdir(&dir, &fno);
#ifdef DBG
if (res != FR_OK)
printf("res = %d f_readdir\n", res);
#endif
if ((res != FR_OK) || (fno.fname[0] == 0))
break;
sprintf(string, "%c%c%c%c %10d %s/%s",
((fno.fattrib & AM_DIR) ? 'D' : '-'),
((fno.fattrib & AM_RDO) ? 'R' : '-'),
((fno.fattrib & AM_SYS) ? 'S' : '-'),
((fno.fattrib & AM_HID) ? 'H' : '-'),
(int)fno.fsize, path, fno.fname);
puts(string);
}
}
}
2021-07-12 09:26 AM
Hello @mfrank9 ,
It is possible to recursively travers the file tree using FATFS and display its content using f_readdir(). A limited example, for inspiration, can be found in the implementation of kStorage_GetDirectoryFiles() (See here) in the STM32G474E-EVAL demonstration project.
Best regards,
@SBEN .2
2021-07-12 10:20 AM
The FatFs library provides you with the means to implement this, but not the code, although you might find some if you look.
Typically a problem that can be solved via recursive, or queued linear, traversal
For a simple single level
puts("Display Directory");
{
DIR dir;
char *path;
UINT BytesWritten;
char string[128];
path = ""; // where you want to list
res = f_opendir(&dir, path);
#ifdef DBG
if (res != FR_OK)
printf("res = %d f_opendir\n", res);
#endif
if (res == FR_OK)
{
while(1)
{
FILINFO fno;
res = f_readdir(&dir, &fno);
#ifdef DBG
if (res != FR_OK)
printf("res = %d f_readdir\n", res);
#endif
if ((res != FR_OK) || (fno.fname[0] == 0))
break;
sprintf(string, "%c%c%c%c %10d %s/%s",
((fno.fattrib & AM_DIR) ? 'D' : '-'),
((fno.fattrib & AM_RDO) ? 'R' : '-'),
((fno.fattrib & AM_SYS) ? 'S' : '-'),
((fno.fattrib & AM_HID) ? 'H' : '-'),
(int)fno.fsize, path, fno.fname);
puts(string);
}
}
}
2021-07-20 02:29 AM
Thank you!
That works.
The following lines don't do what they're supposed to, but I don't know why.
This is not a problem as they work when called individually.
sprintf(string, "%c%c%c%c %10d %s/%s",
((fno.fattrib & AM_DIR) ? 'D' : '-'),
((fno.fattrib & AM_RDO) ? 'R' : '-'),
((fno.fattrib & AM_SYS) ? 'S' : '-'),
((fno.fattrib & AM_HID) ? 'H' : '-'),
(int)fno.fsize, path, fno.fname);
2023-01-26 01:55 AM
Thanks!
Helped me much.