递归输出目录和文件名函数
FRESULT scan_files(char *path)
{
FRESULT res; //定义结果对象
DIR dir; //定义目录对象
UINT i; //定义变量
static FILINFO fno; //定义静态文件信息结构对象
//TCHAR Filepath[128] ={0};
char* Filepath=(char*) mymalloc(SRAMEX,128);
TCHAR *DirPath;
res = f_opendir(&dir,path); //打开目录,返回状态 和 目录对象的指针
if(res == FR_OK) //打开成功
{
for(;;) //遍历
{
res = f_readdir(&dir, &fno); //读取目录,返回状态 和 文件信息的指针
if(res != FR_OK || fno.fname[0] == 0 )
{
//printf("f_readdir end!\r\n");
myfree(SRAMEX,Filepath);
break; //若打开失败 或 到结尾,则退出
}
if((fno.fname[0] =='S'&&fno.fname[7] =='V'))
{
continue;
}
if(fno.fattrib & AM_DIR) //是目录
{
i = strlen(path); //获取原目录长度
//printf(" path:%s,i=%d,File:%s\r\n",path,i,fno.fname);
strcpy(Filepath,path);
if(strcmp("0:/",path)!=0) // 区别根目录
DirPath = strcat(Filepath,"/");
DirPath = strcat(Filepath,fno.fname);
//printf(" DirPath:%s\r\n",DirPath);
res = scan_files(DirPath); //将新目录进行递归调用
if(res != FR_OK)
break; //打开失败则退出
path[i] = 0;
memset(Filepath,0,128);
}
else
{
if(strcmp("0:/",path)==0)
{//printf(" File:%s%s\r\n",path,fno.fname);
} //是文件
else
{ //printf(" File:%s/%s\r\n",path,fno.fname); //是文件
sprintf(Filepath,"%s/%s",path,fno.fname);
download_file(Filepath,fno.fsize);
}
}
}
}
else
{
//printf(" f_opendir fail! res:%d",res); //打开失败
}
f_closedir(&dir); //关闭目录
//printf("f_closedir end!\r\n");
return res; //返回状态
}
递归删除目录和文件名函数
FRESULT del_fatfs_dir(const TCHAR *path)
{
FRESULT res;
DIR dir;
FILINFO fno;
TCHAR file[_MAX_LFN + 2] = {0};
res = f_opendir(&dir, path);
if(res != FR_OK) printf("f_opendir failed %d\r\n",res);
else{
while(1)
{
if(f_readdir(&dir, &fno)!=FR_OK) printf("f_readdir failed %d\r\n",res);
else{
if(0 == strlen(fno.fname)){break;} //若读到的文件名为空 printf(" f_readdir kong");
if(0 == strcmp(fno.fname, ".")){continue;} //若读到的文件名为当前文件夹 printf(" f_readdir .");
if(0 == strcmp(fno.fname, "..")){continue;} //若读到的文件名为上一级文件夹printf(" f_readdir ..");
memset(file, 0, sizeof(file));
sprintf((char*)file, "%s/%s", path, fno.fname);
if (fno.fattrib & AM_DIR){
del_fatfs_dir(file); //若是目录,递归删除
}else{
res = f_unlink(file); //若是文件,直接删除
}
}
}
}
res = f_closedir(&dir);
if(res == FR_OK){
res = f_unlink(path); //删除本身
}
return res;
}