* D/ R8 X" \2 _% J
分享一个STM32移植FAFTS文件系统遍历创建文件夹" l" q' A1 X+ D. k6 M
- FRESULT folder_create(char* path)
2 C9 T% X _: \2 [3 J+ T0 H - {
& G& h% {7 q/ [! ~ - FRESULT res;
, H/ q' f, L8 c n - DIR dir;
; a( q+ Y# Y6 k& P! u9 ~ - char *str = path;, K4 Q" h; J; g' q0 x3 G8 Q% K
- char *pbuf;/ O: ^/ W" Z- W7 ~( E! x: @. n
- u16 cnt=0;* V/ H7 m" S( d" Y: R5 Q3 K
- 6 q A+ r7 ?3 z* ]" h
- res = f_opendir(&dir, path);
2 A$ v: S D0 ?' o7 `# o - if (res == FR_OK) / `. o. {( l* _ [8 L1 ^
- {
! m0 ~( k8 L8 X: d/ m+ s8 M - f_closedir(&dir);# ?. U3 X/ P: l. R& q5 Y6 j
- return FR_OK;
2 W- T; G+ H6 \4 N/ Q/ c - }
! L' p2 q1 e$ h5 o5 X7 B - else
! M$ G7 e$ R: e# R5 M - {5 j# X: }1 m2 i( r& \5 H! k
- pbuf=mymalloc(SRAMIN,200); : [- c' _- ^9 D) Y8 l }7 o
- if(pbuf==NULL)# d# e, v; T( _% l E1 j! }* I
- return FR_NOT_ENOUGH_CORE; 0 n! h6 ^" }- T' F
- while(*str !=0)0 D" {1 z& j0 \ e' g) ?9 A# c9 V
- {
/ g4 H/ a: d) R( q( O - if(*str=='/')
4 n% A, h( R4 l! _4 \ - {! u& |7 z- @1 [& S2 Y6 H W' l
- memset(pbuf,0x00,200);
7 R3 _$ j& M9 y, N3 A - memcpy(pbuf,path,cnt);
: |, P0 c& K: k" j5 c - printf("%s\r\n",pbuf);1 N$ f+ e% R2 P/ k# n( N* w
" _ ?. \9 j( X ?, b- if(f_opendir(&dir, pbuf)==FR_NO_PATH)* D8 V) q5 c' L
- f_mkdir(pbuf);' P r' Y9 \: L" e
- else: D, i t; r. U4 b4 D
- f_closedir(&dir); 9 }) o5 B# S: ]
- }
% Z! i; [. X7 b1 N - ) ~& x7 ]+ V0 Y1 a
- cnt++;. [9 ?1 |2 U y& S% W5 ^- i
-
- X Y" J }; w/ Y: c g - str++;
4 W8 J1 W6 T0 ~$ g; B) X5 _5 S. R - }8 j9 s0 k$ s# Q5 p/ {. i. s0 t
- myfree(SRAMIN,pbuf);
; v( g8 t" Z: N) x, k/ T" y - res = f_mkdir(path);//创建最后一级目录
. f' t9 f! m- S& ]: b8 v - h" i6 ]" p$ Z/ T! U0 I8 c5 S6 A
- }
2 i) G8 R1 C; H: C! T - return res;
/ |% ~& f7 l y1 X( T, b' E - }4 q0 j5 @$ \+ S, t* a
复制代码 调用方法:4 E3 R* l' J5 Y( S% s
- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
" S3 l/ a5 P0 Z3 M# Q, l
复制代码
8 k, o: i* P. F
. r3 _* @9 J3 \
# z" e6 }" V: k0 m2 r* ^
5 |% _; y& @, I# k3 p |
#include <stdlib.h>5 Q1 Q h& }% B9 i4 j6 L
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间1 @( `8 [/ @' N" w2 F' A
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值9 Z8 P6 }5 P' l6 p/ c; q1 \. K
/*****************************************************************************\: {# d* I0 u7 y0 Z
函数功能:歌词解析& c4 F s2 P8 v0 v$ o/ d
形参说明:_cpLrcPath 歌词路径& B" j0 w# ]( g3 j+ k( u+ U' N2 V
返 回 值:0 - 成功 / 1 - 失败0 z' w8 a( {' ?* q! a
\*****************************************************************************// F8 H& {* }! P: D+ a
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)7 G2 j+ q2 s3 \7 r5 }$ Q
{
//变量定义" l' \1 W% S7 i4 Q) S+ d- b% j7 {6 h
FIL fp; //文件指针' z) F. A- z- j0 k
FRESULT res; //文件系统返回值
UINT br; //成功读取的字节数 v* t6 V* O7 y* d ?
uint16_t usTime = 0; //用于临时存放转换计算后的时间
uint32_t ulFileSize; //歌词文件总大小4 j5 T! H8 g- v2 {
uint32_t i = 0, j = 0; //临时变量
char *ptmp = NULL; //歌词内容指针
char *pbuff = NULL; //用于存放所有歌词内容
2 I- Y+ a& ?# s8 t* y/ k
//打开文件5 X) `. F2 U8 V2 e. w0 H
res = f_open(&fp, _cpLrcPath, FA_READ);
if (res == FR_OK)0 I; b: @, B+ e. C" d7 p
{
//计算文件大小3 t) y, w" M F! k* O; @
ulFileSize = f_size(&fp);
//申请空间3 Z$ X: h6 g% S$ q3 R- Q
pbuff = malloc(ulFileSize);
if (pbuff != NULL)9 z/ z. B/ O+ {! E
{
//一次性将总缓冲区读满
res = f_read(&fp, pbuff, ulFileSize, &br);
if (res == FR_OK && br == ulFileSize)
{
//找到歌词的起始位置: R' y3 r9 G* a. J2 `, I
i = 0;% q5 h6 q3 F" {' x
ptmp = strstr(pbuff, "["); 2 T6 Q% g7 l4 [4 z1 w
while (ptmp[i] != '\0') //遍历缓冲区中的信息
{+ K& h9 @" B+ n
/**********************解析时间**********************/
//[00:40.452]: c, M; w: @# O/ p. ]
//[分:秒.毫秒]1 U; Q0 X- T( y8 I3 Z, E
usTime = 0;
//计算该行歌词播放时间(秒),毫秒部分四舍五入
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)7 h( u. O6 L0 S2 g7 O
i++; // ':'/ A0 v) i! ^8 g1 ]6 f" M
usTime += (ptmp[i++] - '0') * 10; //秒(十位)& i! a! v9 w" T0 a
usTime += (ptmp[i++] - '0') * 1; //秒(个位) h" X( ?9 ^" g
i++; // '.'
if (ptmp[i++] >= 5) usTime++;" E+ l8 w* C+ l% z! b" \9 w+ x
//手动调整时间误差# Z# D. x2 n8 t0 q) b6 y
if (usTime > 5) usTime -= (usTime / 10 + 1);
//保存时间
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
printf("%02d:%02d ", usTime/60, usTime%60);
8 n! i" T6 I( V! i1 c) U- k0 w
/**********************拷贝歌词**********************/
j = 0;$ q4 g: t. J; d6 d$ S
//让指针偏移到歌词文本部分
while (ptmp[i++] != ']'); 8 F- D3 f. {- y; S, {, X
//拷贝歌词内容
while (ptmp[i] != '\0' && ptmp[i] != '[')
{/ e0 M! v. K5 j- U5 k
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];
} . j+ K. R; u- ~, x3 R' z! Q' W$ i! [
//制作成字符串
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';$ ]2 t6 @8 Y9 V. q, \# B
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
g_ucLrcTableIndex++;
}# r2 X! v% b; ~8 E/ \
}
free(pbuff);
} + \& @3 A+ M5 _) Q% |6 s8 L% d
f_close(&fp);4 B! g' P! b2 w: U8 B T8 ~
}
if (i != 0) return 0;
else return 1;6 i8 C6 \' b& I% S4 D; a' ^% F2 v& k
}