void cmd_tree(BaseSequentialStream *chp, int argc, char *argv[]) { FRESULT err; unsigned long clusters; unsigned long long total = 0; FATFS *fsp; (void)argv; if (argc > 0) { SHELLDBG("Usage: tree\r\n"); return; } if (!fs_ready) { SHELLDBG("File System not mounted\r\n"); return; } err = f_getfree("/", &clusters, &fsp); if (err != FR_OK) { err = f_getfree("/", &clusters, &fsp); if (err != FR_OK) { SHELLDBG("FS: f_getfree() failed. FRESULT: %d\r\n", err); return; } } SHELLDBG("FS: %lu free clusters, %lu sectors per cluster, %lu bytes free.\r\n", clusters, (uint32_t)SDC_FS.csize, total); fbuff[0] = 0; sdc_scan_files(chp, (char *)fbuff); }
/*! \brief used in cmd_tree function * * Find files on sd card. */ FRESULT sdc_scan_files(BaseSequentialStream *chp, char *path) { FRESULT res; FILINFO fno; DIR dir; int i; char *fn; #if _USE_LFN fno.lfname = 0; fno.lfsize = 0; #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; fn = fno.fname; if (fno.fattrib & AM_DIR) { path[i++] = '/'; strcpy(&path[i], fn); res = sdc_scan_files(chp, path); if (res != FR_OK) break; path[--i] = 0; } else { SDCDEBUG("%s/%s\r\n", path, fn); } } } return res; }