FATFS遍历文件/文件夹可控制遍历深度的方法
/**********************************************************************************************
- function: vPrintf_Dir
- param : *pFolder: 文件夹路径
* nMaxDepth: 最大目录深度 - return : SysStatus_e
- Explain : 打印文件夹
**********************************************************************************************/
#ifdef Used_Debug
static void vPrintf_Dir(TCHAR *pFolder, uint8_t nDepth)
{
for(int i=0; i<7*nDepth; i++){
printf(" “);
}
printf(”|—<< %s >>\n", pFolder);
}
#endif
/**********************************************************************************************
- function: vPrintf_FileName
- param : *pFileName: 文件名
*nDepth: 目录深度 - return : SysStatus_e
- Explain : 打印文件名
**********************************************************************************************/
#ifdef Used_Debug
static void vPrintf_FileName(TCHAR *pFileName, uint8_t nDepth)
{
for(int i=0; i<7*nDepth; i++){
printf(" “);
}
printf(”|***( %s )\n", pFileName);
}
#endif
/**********************************************************************************************
-
function: ePrintf_DirStruct
-
param : *Path: 目录路径
*nMaxDepth: 最大目录深度 -
return : SysStatus_e
-
Explain : 打印目录结构
**********************************************************************************************/
#ifdef Used_Debug
static uint8_t g_nDepthCnt = 0;
static SysStatus_e ePrintf_DirStruct(TCHAR *Path, uint8_t nMaxDepth)
{
DIR tDir;
FRESULT res = f_opendir(&tDir, Path);
SysStatus_e eStatus = eSys_OK;if(res == FR_OK){
vPrintf_Dir(Path, g_nDepthCnt);
g_nDepthCnt++;
do{
res = f_readdir(&tDir, &g_tFileManage.tFileINFO);
if(res == FR_OK){
if(g_tFileManage.tFileINFO.fname[0]){
if((g_tFileManage.tFileINFO.fattrib & AM_DIR) == 0){
/* 目标为文件,打印文件名 /
vPrintf_FileName(g_tFileManage.tFileINFO.fname, g_nDepthCnt);
}else{
/ 目标为文件夹,打印文件夹名称,并执行递归 /
if(g_nDepthCnt < nMaxDepth){
/ 在寻址深度内,进行递归 */
eStatus = ePrintf_DirStruct(g_tFileManage.tFileINFO.fname, nMaxDepth);
if(eStatus != eSys_OK){
break;
}
}
}
}else{
break;
}
}else{
vDebug_Printf(“f_readdir defeat, res=%d\n”, res);
}
}while(res == FR_OK);
if(res == FR_OK && eStatus == eSys_OK && g_nDepthCnt > 0){
g_nDepthCnt–;
}
f_closedir(&tDir);
}else{
vDebug_Printf(“f_opendir defeat, res=%d\n”, res);
}
return eStatus;
}
#endif
/**********************************************************************************************
- function: eFileManage_CreatDir
- param : *RootPath: 根路径
*nMaxDepth: 最大目录深度 - return : SysStatus_e
- Explain : 打印目录结构
**********************************************************************************************/
static SysStatus_e ePrintf_DirectoryStruct(TCHAR *RootPath, uint8_t nMaxDepth)
{
SysStatus_e eStatus = eSys_OK;
#ifdef Used_Debug
g_nDepthCnt = 0;
eStatus = ePrintf_DirStruct(RootPath, nMaxDepth);
#endif
return eStatus;
}
结果如下: