) _# O' d6 d5 E4 X0 l1 w
分享一个STM32移植FAFTS文件系统遍历创建文件夹, d) K7 H7 u B2 z5 h: _# a
- FRESULT folder_create(char* path)
) e; R; K( B" e2 K# o* M - {% s- w0 Z9 F6 D& X1 j. j8 K$ v
- FRESULT res;
& s* S! x) O/ S: u - DIR dir;6 t/ w* h+ J) D* l$ G8 G6 A
- char *str = path;8 A! Q. J1 S; i
- char *pbuf;
' B' m+ o* R" x% c/ I - u16 cnt=0;' Q7 l5 ?( I8 g
- 9 _1 q# x* C9 I$ s+ U$ m4 x
- res = f_opendir(&dir, path); 3 B" W! L) ~! t5 P) I0 o( J
- if (res == FR_OK)
4 t1 f6 G4 H) F* E8 R# Q - {
: Q( w3 q4 \' I2 z; S _# |; ]9 f - f_closedir(&dir);6 B) @1 ~+ |: ]5 b( g& r3 f) v
- return FR_OK;7 i( Y8 q9 n6 |3 c# e* k
- }8 N! B' Y6 l' ]4 l7 O3 C
- else
0 @* w7 Q6 A0 I w - {; B6 A3 Z6 L B6 R9 V F, h2 P3 o
- pbuf=mymalloc(SRAMIN,200); , `; [* c4 f7 |
- if(pbuf==NULL)( j2 A+ {. w! X+ t5 ?% D
- return FR_NOT_ENOUGH_CORE;
9 l" M& Z' h1 o, J1 `9 E - while(*str !=0)
+ e* O. ]0 w6 d5 X' Y4 k - {
* j3 {- o6 a) X6 s - if(*str=='/')6 y% |; l5 j( b
- {6 l$ c. i* C1 Y9 e2 n) O
- memset(pbuf,0x00,200);# t u' H) W$ x9 U
- memcpy(pbuf,path,cnt);6 ~1 b0 y. Y P Q) @! i/ k
- printf("%s\r\n",pbuf);
$ D0 Q* b7 I1 X3 D
# A& l% y3 C( s3 O4 s* t- if(f_opendir(&dir, pbuf)==FR_NO_PATH)4 h3 U6 n f7 f3 E3 \6 M( W, n+ c
- f_mkdir(pbuf);
% k; s6 J( n% L( A+ T1 s - else) ~& r5 m: n# U/ I: u
- f_closedir(&dir); 8 t- v# j& b+ s, w
- }
/ \& e' m& T! A$ c( W0 X f -
" a# ~# n- ?4 I4 g - cnt++;- n$ w% ?) t. o8 Q3 |- U3 b5 R
-
7 U2 ~9 C7 q( o5 Q) ^ - str++;
. s4 Y9 ^. t; Q+ K0 k9 \+ I* ] - }# h1 I4 i- v) D2 E t! `4 \
- myfree(SRAMIN,pbuf);
+ w) [+ C. A ~( H# p - res = f_mkdir(path);//创建最后一级目录) y# ?/ }/ {( p) K
- 9 M+ f/ Y/ ]. m& I! Z7 \! h
- }
& H- v$ X: Q0 U: z; @; t# v - return res;
" S+ R3 j9 p7 Y0 c, Q8 {5 H - }
5 [; ?! V! B1 v; [
复制代码 调用方法:9 r6 X' l. Z: c# k
- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
+ k* c7 p' S9 I5 K2 J" V% P- X
复制代码 & e3 @$ a# f9 p+ A; q
% l+ x: ?0 J/ H
1 d+ z* H2 n- t6 M* f" P: x+ U: x& b& U O* c0 j+ U" ]2 X6 `$ R+ ?
|
#include <stdlib.h>
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间% C5 P+ m4 T* e
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本9 f; _* Q! p$ e. }3 i
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值& q/ u9 b" p$ }& j
/*****************************************************************************\
函数功能:歌词解析
形参说明:_cpLrcPath 歌词路径1 G8 E7 U( L! L5 H( A8 L9 }7 s+ K
返 回 值:0 - 成功 / 1 - 失败3 o# E; Y# D! P' D: I* C& x8 O0 k
\*****************************************************************************/
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
{
//变量定义" z1 L3 O$ ?2 X9 z& I
FIL fp; //文件指针3 r2 s( }8 K6 j% d9 K/ H; F( i
FRESULT res; //文件系统返回值
UINT br; //成功读取的字节数
uint16_t usTime = 0; //用于临时存放转换计算后的时间
uint32_t ulFileSize; //歌词文件总大小
uint32_t i = 0, j = 0; //临时变量6 H+ M7 v* ]8 W5 A
char *ptmp = NULL; //歌词内容指针: w5 p/ K0 ?* S p+ ?* C
char *pbuff = NULL; //用于存放所有歌词内容) d5 B. r8 U9 L) v# i! ^
//打开文件& N9 X6 `( [8 j: t9 g3 W8 s
res = f_open(&fp, _cpLrcPath, FA_READ);
if (res == FR_OK)
{
//计算文件大小5 ]+ d' x: z' t0 r! A; Y
ulFileSize = f_size(&fp);6 `' y, P: @$ f' h; Q
//申请空间
pbuff = malloc(ulFileSize);* A# H o0 X3 o. R/ ~
if (pbuff != NULL)6 ^8 c) C0 l! ~5 X4 m2 I5 V7 j) O( Y6 G% V
{( }2 E8 `8 R- E+ f8 e! \9 G
//一次性将总缓冲区读满
res = f_read(&fp, pbuff, ulFileSize, &br);5 }5 |: E& S+ [/ q& ?' Z
if (res == FR_OK && br == ulFileSize)
{/ Y, g* ~% {( w& ^4 P1 k, w
//找到歌词的起始位置
i = 0;
ptmp = strstr(pbuff, "[");
while (ptmp[i] != '\0') //遍历缓冲区中的信息
{
/**********************解析时间**********************/
//[00:40.452]
//[分:秒.毫秒]. R" C. L" `5 d& g
usTime = 0;
//计算该行歌词播放时间(秒),毫秒部分四舍五入# ?- q* \# u% M6 q: l$ y* N
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)' b* f/ @* v g5 x* ]
i++; // ':'
usTime += (ptmp[i++] - '0') * 10; //秒(十位)- r) u9 a" W. `4 A! o/ H3 j" p
usTime += (ptmp[i++] - '0') * 1; //秒(个位)/ K& _" @9 z6 K; I4 D* Z6 k
i++; // '.'3 z, |# V) |! A* O
if (ptmp[i++] >= 5) usTime++;
//手动调整时间误差
if (usTime > 5) usTime -= (usTime / 10 + 1);
//保存时间7 A) n% C7 p$ D" D
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;/ L) _" h5 v$ U2 N/ d9 z
printf("%02d:%02d ", usTime/60, usTime%60);1 B. O+ s) o$ H. Z) N8 Y5 j" w0 v
/**********************拷贝歌词**********************/
j = 0;' T! x& m$ g1 o* {. `
//让指针偏移到歌词文本部分 ) Q2 i" ^5 |4 B! d( G+ i5 X
while (ptmp[i++] != ']');
//拷贝歌词内容
while (ptmp[i] != '\0' && ptmp[i] != '[')
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++]; 0 T: d# N: x+ b3 _. x1 ~& A b
}
//制作成字符串
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';7 ?6 W6 q- O- n1 C4 F& F* ~
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
g_ucLrcTableIndex++;
}
}2 U$ f" Q( V. E. c$ v: T
free(pbuff);
} + z" U2 C7 }* b( k" Z
f_close(&fp);: q+ c9 }$ T' Q9 v5 r8 m- f4 x
}
if (i != 0) return 0;
else return 1;
}9 C A. i2 }8 P( G/ y2 ~# L+ j