* ]8 z, i2 f. P; w" {7 i# H7 {+ l% `分享一个STM32移植FAFTS文件系统遍历创建文件夹7 P8 {/ Y) K' l( u
- FRESULT folder_create(char* path)2 J% }+ e- @$ C& b
- {
# E1 R6 B& Z/ {; T' d - FRESULT res;
0 Q. A# O. B. E" k. t - DIR dir;
+ d1 Q/ X' Z; H - char *str = path;
( B$ W0 L& g) {, r0 `1 b9 h - char *pbuf;2 I9 Q9 D" Q. f) { F1 V9 |" j
- u16 cnt=0;6 n( e+ z9 Q1 j6 H# A% V
- ( T( Y* y% k2 _7 H2 s
- res = f_opendir(&dir, path); ! ^ d; k5 A0 b x4 S& `
- if (res == FR_OK)
r7 X5 W- v2 ]! Q" q - {
- c& }- B* X: D. J* z; p3 ^ - f_closedir(&dir);
/ ?) z$ _: `5 f3 i: c% b - return FR_OK;$ A8 [( m4 h P! `
- } K- x# N+ o4 }' r" u
- else
- i# K% e. x' S - {9 d3 Z- }( M2 X g: g! s+ ]0 V) F
- pbuf=mymalloc(SRAMIN,200);
& V( T4 Z0 k/ M& q0 |& Z - if(pbuf==NULL)
! O4 B# f5 L, h9 a' ]3 I9 Q - return FR_NOT_ENOUGH_CORE;
2 R8 Y: ]. u6 j/ Q2 j; C - while(*str !=0); I0 S+ ?5 p1 k2 W
- {) w% l+ }* Y- O' [9 z
- if(*str=='/')
/ C7 q( B5 d# v" A - {
( ~8 v/ N) R2 _, _- U; ^ - memset(pbuf,0x00,200);* ~9 C. {% k' g2 D
- memcpy(pbuf,path,cnt);
" t5 {& E l E( E, y) T# t - printf("%s\r\n",pbuf);1 y/ h! j: e# Z' Y8 q* r
- / W: _+ T0 [2 \* m0 B
- if(f_opendir(&dir, pbuf)==FR_NO_PATH)" Q) O. e1 Y% {0 k+ @
- f_mkdir(pbuf);7 z$ a: `( _5 @- E
- else
- G2 \5 r; P' \9 f1 w4 v - f_closedir(&dir); ! C5 x* m2 Z1 a0 b# q
- }
+ m% j+ d+ p' @ -
4 z' A: {4 Q" C! m1 D2 R) A - cnt++;
6 x% A# D, q7 B \ -
5 \6 D& B G+ P' | - str++;0 g& \; A1 d. b" N5 D1 k8 [
- } R' y _5 Z% Q/ B
- myfree(SRAMIN,pbuf);
, [6 @4 L a% |5 d - res = f_mkdir(path);//创建最后一级目录/ n; d1 g" k5 k& u1 Q. ^0 S5 h
-
. p7 H* _. T% Y6 q$ P O - }
+ ^! l! Y; @. h& I# J0 e - return res; a* \9 F: b( f
- }
, u7 y4 w6 `7 J' k) @# R1 i
复制代码 调用方法:
3 ?8 m d7 m; t/ K- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");. A) a( c& q$ U
复制代码 & W/ f/ D" H$ z u2 j# X7 B8 H5 I
+ e' Y% A7 ]; S! E! [
2 _" k: A4 ^: r, s! R! R/ M- ]9 O. b' O) V5 ?9 f- m' _
|
#include <stdlib.h>8 D5 v' u1 J! Y7 i* S
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间 ]5 I/ _1 ?' d# Q3 @
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本0 W& C1 |& K: v! I
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值
/*****************************************************************************\
函数功能:歌词解析+ a# y2 B6 [! x# v+ n1 c; m/ n
形参说明:_cpLrcPath 歌词路径3 o1 U. h4 a: L
返 回 值:0 - 成功 / 1 - 失败6 b: B& i3 i( _" k$ ]% ^/ N
\*****************************************************************************/) H* ^" u% U& }" \8 Z+ [1 r! S
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
{
//变量定义
FIL fp; //文件指针" b0 r9 N5 k9 f; p
FRESULT res; //文件系统返回值7 K9 O: w" N: }& j) B2 l
UINT br; //成功读取的字节数
3 w" x1 w1 I( e
uint16_t usTime = 0; //用于临时存放转换计算后的时间% b3 N1 C. i; G1 @
uint32_t ulFileSize; //歌词文件总大小: g3 v! f' b$ C, y+ ]- U
uint32_t i = 0, j = 0; //临时变量 b# w- ]% @5 r( Q5 s( b" A% A# P; ~
char *ptmp = NULL; //歌词内容指针
char *pbuff = NULL; //用于存放所有歌词内容
//打开文件, g( a0 Q& `( w ?
res = f_open(&fp, _cpLrcPath, FA_READ);# ^- [2 f8 ~0 h( o
if (res == FR_OK)
{" a& B x7 m x! _: X3 a) ^$ u
//计算文件大小% P8 j- q1 C2 z2 r0 E- J& d
ulFileSize = f_size(&fp);) I/ x! v7 ^+ U0 l; L
//申请空间) j- X5 n8 P! G" G, F+ w8 \
pbuff = malloc(ulFileSize);$ N, n7 W2 H+ c0 E
if (pbuff != NULL)
{
//一次性将总缓冲区读满3 @7 {9 l; Y4 y2 \! n4 a8 ^
res = f_read(&fp, pbuff, ulFileSize, &br);
if (res == FR_OK && br == ulFileSize)
{
//找到歌词的起始位置
i = 0;4 K( S1 ^; Y1 z8 @
ptmp = strstr(pbuff, "["); " b0 q Z' ^& J4 ?/ K2 a
while (ptmp[i] != '\0') //遍历缓冲区中的信息
{
/**********************解析时间**********************/- A# f6 x X3 w) \
//[00:40.452]
//[分:秒.毫秒]
usTime = 0;5 P" q/ T2 z# q* C
//计算该行歌词播放时间(秒),毫秒部分四舍五入! h: ], e% q# R7 H; g# [
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)) Y j! R( P$ s" r3 [6 H7 x
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)
i++; // ':'* J/ k* x" }4 x, S" L# a: R: n& f
usTime += (ptmp[i++] - '0') * 10; //秒(十位)
usTime += (ptmp[i++] - '0') * 1; //秒(个位)& Q0 s, q' ?! f
i++; // '.'
if (ptmp[i++] >= 5) usTime++; `6 J- x/ S/ V9 b$ o( k0 O" @+ j
//手动调整时间误差7 d/ O0 o" w$ ~' w$ p
if (usTime > 5) usTime -= (usTime / 10 + 1);; U* [9 _6 m' D1 l
//保存时间
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;8 }5 x! U3 x1 F
printf("%02d:%02d ", usTime/60, usTime%60);
$ p7 [8 y- d v$ L
/**********************拷贝歌词**********************/
j = 0;
//让指针偏移到歌词文本部分 o, G# Y' q. [9 n- c6 F3 t M
while (ptmp[i++] != ']');
//拷贝歌词内容$ w/ I9 b( n- n( G" a, r3 }" U N7 _; L
while (ptmp[i] != '\0' && ptmp[i] != '[') 9 d9 r& s( o S3 z7 n* D
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++]; 2 S0 H7 y! ^) _4 w e. w4 r
} 1 a3 ~+ K) X% X: X; A
//制作成字符串
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]); ]7 i* ?& z1 e. A/ Q* i* S
g_ucLrcTableIndex++;
}, b8 [- s# w* m+ s f8 ?9 G
}; t0 U& ^. {- C: [& l' C& @, S! C% O+ C
free(pbuff);& }+ Y* E# a$ `) P( f7 \
}
f_close(&fp);, v% Q# i. @7 P8 K
}& x3 Q9 G4 _* I
if (i != 0) return 0;
else return 1;; ^ X# @: b4 H( T! I/ }2 }0 B
}/ V% C7 N+ C% Y4 s8 [# @- G$ A9 M
* X6 r0 p% `2 p# o& V9 N2 a: r