Skip to main content
Visitor II
July 12, 2021
Solved

FATFS: show all files

  • July 12, 2021
  • 4 replies
  • 6634 views

Hi,

is it possibility to show a list of files and folders with the fatfs library?

Like "ls" in the console.

    This topic has been closed for replies.
    Best answer by Tesla DeLorean

    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);
     }
     }
     }

    4 replies

    Visitor II
    July 12, 2021

    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​ 

    Graduate II
    July 12, 2021

    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);
     }
     }
     }

    July 20, 2021

    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);

    Visitor II
    January 26, 2023

    Thanks!

    Helped me much.