1 X3 G7 a- p/ ]' x- }: K分享一个STM32移植FAFTS文件系统遍历创建文件夹" N! {3 z2 D% ~* e1 c+ Z
- FRESULT folder_create(char* path)
. W: B" ?# S2 G1 f# v- t- x: { - {& r, L8 _5 Q' z. k$ x/ D% Z
- FRESULT res;
. O( l" @8 p" H- f - DIR dir;- Y3 d) `, b$ ~# f' C
- char *str = path;
. ~* b7 S T, g4 d - char *pbuf;
O6 Y# i" r+ D e4 c+ J - u16 cnt=0;* ]& V6 i0 r% B7 c! P
-
) E) @: H1 r7 N$ X: w - res = f_opendir(&dir, path); ; J! M4 C! @& B0 R; u4 b/ o0 q. r
- if (res == FR_OK)
2 n( u- v3 Y: W8 H8 @ - {0 b& I, B# k' ~. S, D V9 a+ V7 W) _
- f_closedir(&dir);/ `- _/ [, Z% j! ^9 w" r) e
- return FR_OK;- c, c2 _2 h/ h( R
- }+ K9 k) n4 V7 T, {5 _- m+ _$ o3 P* e& d
- else+ d" p$ c% \) P- n& ?3 r- f2 I( o
- {
0 o* U U& o6 ~- E - pbuf=mymalloc(SRAMIN,200);
8 c' m3 b) ~, b( G$ D - if(pbuf==NULL). v& A( | E5 E5 [6 v2 W
- return FR_NOT_ENOUGH_CORE;
0 l( z. Y1 |0 I% A - while(*str !=0)7 C$ U2 V9 Q# ]
- {
8 d% w" v/ P. b6 c7 O - if(*str=='/')
8 m4 J$ K: i9 i7 t% q. v - {5 ]& \8 H1 i/ X1 L9 a2 _1 P6 y4 z
- memset(pbuf,0x00,200);4 x9 }- @3 Z" i4 M
- memcpy(pbuf,path,cnt);
) x) q% {) x; J0 X+ ` - printf("%s\r\n",pbuf);
4 c9 n' F* y/ P+ z# M+ t9 B0 u
0 Q# V+ [# S) A1 }; @: |! ]- if(f_opendir(&dir, pbuf)==FR_NO_PATH)7 F; I' Q! n" X" q& t8 v7 o
- f_mkdir(pbuf);
% ]! E* f. C, o, l+ k1 b - else/ J6 }" d4 y% G3 D* X
- f_closedir(&dir); . n/ f/ o4 n: _2 Y
- }+ G' U) Z2 v7 Z2 f2 [
-
1 i) d: ~: u# P w - cnt++;
8 z) d; b4 R, w8 d/ ` -
g' D# N# s* C2 F2 r8 y' \# M - str++;
9 i& m1 y A* _8 B7 l: t - }
8 E0 R9 }: o( x - myfree(SRAMIN,pbuf); ( [ x+ G; ]+ ^! x
- res = f_mkdir(path);//创建最后一级目录# K. K1 g. `/ h- N1 {) I2 @5 t
-
. {; |7 e) X/ { - }: ~$ T: N( s! V7 O$ w: e1 h" e
- return res;
' \# _. z) f1 A$ W+ p- c - }0 j2 g) l0 r0 `8 h/ J6 ~8 z
复制代码 调用方法:) c& U+ j T) z( \6 Z) O
- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");6 [$ K9 s8 _0 [4 L) Z3 b+ \1 [0 J
复制代码
1 T+ n( s( t1 f7 [; ]) \
2 M+ `2 u1 e, k% [2 U
* B3 j# |0 |( h w& f5 i6 K; W7 h) `2 A* F2 k5 f6 i0 M- r4 T# R( d
|
#include <stdlib.h>0 J! \( F- s+ K( u
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间0 a- ]- p* A! P. i
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本( I7 y. T* R2 j, O% @2 V" P
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值
/*****************************************************************************\$ ]- q" {/ O n* r$ y; J! w
函数功能:歌词解析
形参说明:_cpLrcPath 歌词路径# q& n- w {5 h6 s
返 回 值:0 - 成功 / 1 - 失败
\*****************************************************************************/
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
{
//变量定义0 r' f+ r0 i! y
FIL fp; //文件指针+ D) Z2 g% E) L: W# T3 G
FRESULT res; //文件系统返回值
UINT br; //成功读取的字节数
5 C3 @; ]. ]) S& e
uint16_t usTime = 0; //用于临时存放转换计算后的时间: Z& ^$ o; u4 L" e$ }- c
uint32_t ulFileSize; //歌词文件总大小
uint32_t i = 0, j = 0; //临时变量9 w" H& ?! c3 q N1 ?
char *ptmp = NULL; //歌词内容指针
char *pbuff = NULL; //用于存放所有歌词内容- ]; @ e, G) D( f! J
. ]+ V, F! i) F
//打开文件( B1 }& G# P4 `3 |/ C
res = f_open(&fp, _cpLrcPath, FA_READ);- B# `) W, R6 D9 M, a
if (res == FR_OK)5 L6 \ {7 D# p' l- U
{; c- q' M. I) y. A- M
//计算文件大小
ulFileSize = f_size(&fp);
//申请空间+ d5 F. b6 [, b/ }2 {3 T" v
pbuff = malloc(ulFileSize);
if (pbuff != NULL)
{
//一次性将总缓冲区读满
res = f_read(&fp, pbuff, ulFileSize, &br);. ?9 h& j2 V# {+ g4 @; j
if (res == FR_OK && br == ulFileSize)" x, Z8 K# ^2 W3 K9 F0 @ _( T
{. w" Z' \# g5 d4 ^: l
//找到歌词的起始位置& f& w, r3 _5 V( }, f
i = 0;8 D0 ^+ B9 b1 |% y7 f
ptmp = strstr(pbuff, "["); {3 ~9 ?3 g/ A* I7 E# Y1 I9 _
while (ptmp[i] != '\0') //遍历缓冲区中的信息 I- F( j8 s N2 V) G1 ^ A
{6 E: L$ l3 Y' E
/**********************解析时间**********************/
//[00:40.452]* R0 K7 A' ~( U
//[分:秒.毫秒]# x5 \5 g1 _! L% K: a" ]
usTime = 0;! j3 C. p& C$ F( O' }+ N
//计算该行歌词播放时间(秒),毫秒部分四舍五入" Q2 b0 N- c$ E& Q& z) u
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)
i++; // ':'
usTime += (ptmp[i++] - '0') * 10; //秒(十位)
usTime += (ptmp[i++] - '0') * 1; //秒(个位)/ @2 W, j+ ?0 K; y/ N
i++; // '.'% g! _6 z' }5 ]- l' Z+ m
if (ptmp[i++] >= 5) usTime++;
//手动调整时间误差
if (usTime > 5) usTime -= (usTime / 10 + 1);
//保存时间 K! N/ |# z7 M. @ v8 T6 @6 b/ g
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;- L& I8 _/ f7 ]: _
printf("%02d:%02d ", usTime/60, usTime%60);
6 ^9 Q8 k# V: a! |4 Q: r( L* V
/**********************拷贝歌词**********************/
j = 0;( j; }, ^ }& e. A# E& _
//让指针偏移到歌词文本部分 3 s4 M) c8 J2 U {4 E; x: s
while (ptmp[i++] != ']'); # i) H) X9 C6 p0 K( {: L7 r" ^/ Z" I, T
//拷贝歌词内容- N6 G ]3 z$ F
while (ptmp[i] != '\0' && ptmp[i] != '[') , v* O$ z/ Z9 V! x1 e' j8 d
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++]; 1 @7 ~) x9 b% ]0 t$ X9 m E
}
//制作成字符串: m( E: [9 |" d/ e& c4 l
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
g_ucLrcTableIndex++;& }5 f, o& I6 Y
}
}5 [4 q, L4 @1 |' \4 M# f5 P
free(pbuff);
}
f_close(&fp);* b" C: C/ I& _$ c7 f2 H
}
if (i != 0) return 0;+ G0 Q6 ?& [ K$ W4 O/ N; S
else return 1;% f/ k; E1 J+ `0 ]
}7 L7 q+ H' ]# E9 H
: y9 ~% v8 _* i2 t5 b: m8 f