+ s0 P' m) b2 R. n. y3 J分享一个STM32移植FAFTS文件系统遍历创建文件夹
' ]9 Q. z% ~, ?- FRESULT folder_create(char* path)0 y) W' J0 ^# w4 G0 x# G
- {
3 A- `* e8 `# D* i0 s - FRESULT res;+ V5 I a3 c* I& }
- DIR dir;
0 C. i+ W7 J [( L; ^3 C Z - char *str = path;
; ?$ T* K6 |, I - char *pbuf;
9 T" D, L/ `5 t. C7 I9 |# m. z - u16 cnt=0;$ K" [& G a' P0 z/ b
-
( g) r" v8 S( H; X9 G5 q - res = f_opendir(&dir, path); 8 w4 a9 i% c$ C
- if (res == FR_OK) ) v3 M. O# }7 C4 y' l
- {
: Q# H; O" R6 t6 f! T& J7 ], R - f_closedir(&dir);3 i: X u3 y- \& C; V) Z1 y7 W5 ^" \
- return FR_OK;3 K! R% h5 K9 \! v0 s* C' z3 a
- }$ N* ]( c! w& C5 D* j& `* C
- else3 Y: c: N( Q9 i6 |' l+ S7 @
- {
5 j. U+ H3 Y/ z* w - pbuf=mymalloc(SRAMIN,200);
1 B4 } C0 x& Y - if(pbuf==NULL)
* o: M a; K1 M b& L - return FR_NOT_ENOUGH_CORE;
5 Y8 f0 O4 O6 ] - while(*str !=0)3 f! q5 W' H) M4 s4 a
- {
4 o2 ~) |5 }$ G) E8 w" l1 Y - if(*str=='/')2 u \, N$ \4 |- N* _7 b3 C
- {" Q1 o/ x( J0 x4 S4 O7 F
- memset(pbuf,0x00,200);
5 s; [( B# n* l9 j! W - memcpy(pbuf,path,cnt);: Y3 R" k' _+ `' Z V- a
- printf("%s\r\n",pbuf);* }8 H8 m: `: h4 p/ N
" n' I% L7 ?: r4 ^8 R- if(f_opendir(&dir, pbuf)==FR_NO_PATH). Y% G' U5 Z. j
- f_mkdir(pbuf);8 |2 q; O* Y7 } Z) n) g
- else
$ P. a# Q& L, H# H - f_closedir(&dir); . _/ j; E8 `" w& d3 ?
- }
7 h: i. ]6 i" t1 S! a - 9 o+ Z: a2 Z8 q! }% R. r6 a
- cnt++;9 |' \ g+ |* j" q
- 7 @. @0 X# w& L3 F
- str++;$ k$ _* T" S6 K* f+ {8 K D& N
- }
2 a; r7 B7 b7 L' i: n& p - myfree(SRAMIN,pbuf); 2 k* t, Q+ t1 l1 s1 l# b
- res = f_mkdir(path);//创建最后一级目录
5 U7 ?) x9 k8 _$ } -
- ]1 ~$ k B1 z9 Y1 x - }& X& H% d+ C# N" \& Z
- return res;) P) S0 I3 e! I. C+ u& c _+ f' u
- }- Q0 p( ?+ o7 T N5 \7 a c# ?0 l: k
复制代码 调用方法:+ J8 r% l: O1 u1 `1 m/ j% z
- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
/ ]5 b, b1 x$ |
复制代码
; `; H0 c* p2 a3 ?( D/ ~" a- u N. X
- y5 ?* v- F- t4 B0 J0 l) m( ]& {. q# R5 a# a- L7 O
5 `$ t/ c7 U- e4 U, L# c
|
#include <stdlib.h>$ A$ x# I" I# \3 \
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间. ~9 s$ @7 t* ^& X
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值
/*****************************************************************************\7 _& @3 h# M+ |6 ]2 V
函数功能:歌词解析
形参说明:_cpLrcPath 歌词路径
返 回 值:0 - 成功 / 1 - 失败
\*****************************************************************************/
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
{2 ], L; O+ x9 d2 {2 O. P
//变量定义3 L. K9 b6 i: d7 ? v0 b8 J
FIL fp; //文件指针8 V* w8 }9 P. i) r
FRESULT res; //文件系统返回值
UINT br; //成功读取的字节数1 `1 \2 x' _% [8 c! F/ z
4 r! V' W& c6 D3 Z" }$ M# S7 y
uint16_t usTime = 0; //用于临时存放转换计算后的时间$ F7 E I! W. w
uint32_t ulFileSize; //歌词文件总大小8 I" i% S5 ~1 q
uint32_t i = 0, j = 0; //临时变量
char *ptmp = NULL; //歌词内容指针! | c1 w1 R% d$ ?) x4 a
char *pbuff = NULL; //用于存放所有歌词内容5 S' P& q& b' `: h
//打开文件# P0 M" p, ~: V
res = f_open(&fp, _cpLrcPath, FA_READ);7 F5 h5 y+ {( k3 b+ d/ C
if (res == FR_OK)0 o. ~ b5 A+ g7 P! J. D
{/ J+ f# l! L8 r- U
//计算文件大小% Q' o6 w6 m$ q v
ulFileSize = f_size(&fp);
//申请空间
pbuff = malloc(ulFileSize);
if (pbuff != NULL)- f2 N5 S% P3 C2 F" J g
{
//一次性将总缓冲区读满
res = f_read(&fp, pbuff, ulFileSize, &br);# R! c0 _; I" [; i& x
if (res == FR_OK && br == ulFileSize)
{7 f. U2 b/ ~ B0 W; s8 G* c7 v: E
//找到歌词的起始位置: x' A2 t5 p: L, A9 ^+ @
i = 0;
ptmp = strstr(pbuff, "["); / ^) }+ H* F, j
while (ptmp[i] != '\0') //遍历缓冲区中的信息3 ^; f% \2 B+ w# H
{
/**********************解析时间**********************/
//[00:40.452]1 X% F& s9 w) P* B+ K% _
//[分:秒.毫秒]
usTime = 0;
//计算该行歌词播放时间(秒),毫秒部分四舍五入
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)9 X6 q* E; j B% q, K; ]' z* ?
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)
i++; // ':'
usTime += (ptmp[i++] - '0') * 10; //秒(十位)
usTime += (ptmp[i++] - '0') * 1; //秒(个位)7 x. u _9 |) d8 F. f/ B, b
i++; // '.'
if (ptmp[i++] >= 5) usTime++; F" E# D! A' z
//手动调整时间误差6 d3 E9 l( {3 `7 ^
if (usTime > 5) usTime -= (usTime / 10 + 1);) T$ D- B0 f3 D: f- O0 P
//保存时间) x1 e- P% [6 J& g
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
printf("%02d:%02d ", usTime/60, usTime%60);( c1 F3 O4 @5 G+ l& R2 d9 F
' v" r, o6 F7 Y2 }+ h' ~
/**********************拷贝歌词**********************/8 k2 H" [8 [& P; W/ V1 d
j = 0;
//让指针偏移到歌词文本部分
while (ptmp[i++] != ']');
//拷贝歌词内容
while (ptmp[i] != '\0' && ptmp[i] != '[') ! B9 }% R6 {. ^! |6 J$ |
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];
}
//制作成字符串+ p6 M+ C) {! y, _: A5 n
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
g_ucLrcTableIndex++;3 Q" p4 }9 }. U8 x4 T
}* A5 r6 |+ G H
}2 ?! s w& j. s; [4 s9 }
free(pbuff);. m- h$ c8 Y) b3 D. |( @
} , c/ Q3 M+ k5 \( [. L
f_close(&fp);
}
if (i != 0) return 0;( D5 P; ?+ Y; ]: g8 o# {
else return 1;! s2 P) f! H+ Y) c
}/ A! |" X0 H9 N
% Q+ w _7 X3 ~# F