cancel
Showing results for 
Search instead for 
Did you mean: 

FATFS: show all files

mfrank9
Associate III

Hi,

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

Like "ls" in the console.

1 ACCEPTED SOLUTION

Accepted Solutions

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

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

View solution in original post

4 REPLIES 4
SBEN .2
Senior II

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​ 

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

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
mfrank9
Associate III

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

TBode.1
Associate

Thanks!

Helped me much.