分享一个STM32移植FAFTS文件系统遍历创建文件夹
- FRESULT folder_create(char* path)
- {
- FRESULT res;
- DIR dir;
- char *str = path;
- char *pbuf;
- u16 cnt=0;
-
- res = f_opendir(&dir, path);
- if (res == FR_OK)
- {
- f_closedir(&dir);
- return FR_OK;
- }
- else
- {
- pbuf=mymalloc(SRAMIN,200);
- if(pbuf==NULL)
- return FR_NOT_ENOUGH_CORE;
- while(*str !=0)
- {
- if(*str=='/')
- {
- memset(pbuf,0x00,200);
- memcpy(pbuf,path,cnt);
- printf("%s\r\n",pbuf);
- if(f_opendir(&dir, pbuf)==FR_NO_PATH)
- f_mkdir(pbuf);
- else
- f_closedir(&dir);
- }
-
- cnt++;
-
- str++;
- }
- myfree(SRAMIN,pbuf);
- res = f_mkdir(path);//创建最后一级目录
-
- }
- return res;
- }
复制代码 调用方法:
- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
复制代码
|
#include <stdlib.h>
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值
/*****************************************************************************\
函数功能:歌词解析
形参说明:_cpLrcPath 歌词路径
返 回 值:0 - 成功 / 1 - 失败
\*****************************************************************************/
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
{
//变量定义
FIL fp; //文件指针
FRESULT res; //文件系统返回值
UINT br; //成功读取的字节数
uint16_t usTime = 0; //用于临时存放转换计算后的时间
uint32_t ulFileSize; //歌词文件总大小
uint32_t i = 0, j = 0; //临时变量
char *ptmp = NULL; //歌词内容指针
char *pbuff = NULL; //用于存放所有歌词内容
//打开文件
res = f_open(&fp, _cpLrcPath, FA_READ);
if (res == FR_OK)
{
//计算文件大小
ulFileSize = f_size(&fp);
//申请空间
pbuff = malloc(ulFileSize);
if (pbuff != NULL)
{
//一次性将总缓冲区读满
res = f_read(&fp, pbuff, ulFileSize, &br);
if (res == FR_OK && br == ulFileSize)
{
//找到歌词的起始位置
i = 0;
ptmp = strstr(pbuff, "[");
while (ptmp[i] != '\0') //遍历缓冲区中的信息
{
/**********************解析时间**********************/
//[00:40.452]
//[分:秒.毫秒]
usTime = 0;
//计算该行歌词播放时间(秒),毫秒部分四舍五入
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)
i++; // ':'
usTime += (ptmp[i++] - '0') * 10; //秒(十位)
usTime += (ptmp[i++] - '0') * 1; //秒(个位)
i++; // '.'
if (ptmp[i++] >= 5) usTime++;
//手动调整时间误差
if (usTime > 5) usTime -= (usTime / 10 + 1);
//保存时间
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
printf("%02d:%02d ", usTime/60, usTime%60);
/**********************拷贝歌词**********************/
j = 0;
//让指针偏移到歌词文本部分
while (ptmp[i++] != ']');
//拷贝歌词内容
while (ptmp[i] != '\0' && ptmp[i] != '[')
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];
}
//制作成字符串
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
g_ucLrcTableIndex++;
}
}
free(pbuff);
}
f_close(&fp);
}
if (i != 0) return 0;
else return 1;
}