/ E/ @5 L7 F8 A& V- l
分享一个STM32移植FAFTS文件系统遍历创建文件夹
) \. m, d# n' Y+ E) J2 h, u) ~- FRESULT folder_create(char* path)
7 s7 J; @/ Q: x8 e- S! L - {
+ g& C: n2 @$ t. m6 A - FRESULT res;" K7 c5 ]. q# Z6 i6 i
- DIR dir;
) t3 e6 y& D& c* ?. ] - char *str = path;% G. u: U6 s8 f/ I$ O2 ^
- char *pbuf;# X& q/ ?$ M0 s; L& }$ ~
- u16 cnt=0;
g' Y) |8 a; {6 {* ? - ) @! _: e' i! i) h
- res = f_opendir(&dir, path);
. T, L( p- X, d9 m7 A - if (res == FR_OK)
6 l6 e$ [/ M6 ]! h8 o3 { - { k: c7 o5 T9 J
- f_closedir(&dir);
' Z% S/ M6 C' F1 w7 a - return FR_OK;# z2 [, ~+ }$ Q3 y. m( T" I
- } v3 A( D$ }4 e+ W$ z3 p ~1 r, y
- else& I5 }3 y g3 g, i6 S# K
- {
# \: m4 H8 c% h2 E3 \& w& i: P- O - pbuf=mymalloc(SRAMIN,200); ; b: W7 |. k8 M9 m' y% f
- if(pbuf==NULL)- R) J; X/ i# G6 B
- return FR_NOT_ENOUGH_CORE; ' g1 _5 Y k2 \! V9 O: h
- while(*str !=0)+ g' M" l$ G6 L: [
- {
0 n/ }7 P' k4 k& Z) G& T+ ~. z - if(*str=='/')
' W5 E% O1 a9 [9 ~ - {
f. J- H% P2 T3 F - memset(pbuf,0x00,200);% ~* }) e3 A; `$ ?9 N
- memcpy(pbuf,path,cnt);, E+ @; M# z) L, p
- printf("%s\r\n",pbuf);
# q% J9 N, g5 d3 ^
# j7 J$ ?7 J' ~, Q4 v- if(f_opendir(&dir, pbuf)==FR_NO_PATH)
( t: h2 Z7 z( W7 R+ w4 J - f_mkdir(pbuf);
3 a. m5 ?, f' w, T. f* Y6 ] - else
' g; _8 t4 O8 L& q! h6 y3 X5 Y0 n - f_closedir(&dir);
; B t! M5 t2 v$ v9 B" d3 s( n, q# e - }
) S1 c$ i3 O3 e5 i -
7 ?: E7 t* D+ v5 D7 X4 n - cnt++;. ^0 S6 `) Z- F( F
-
) s, ~) r" y: `: e! T$ H- N - str++;8 r; S( |2 k+ U: q- M/ f
- }
1 N# y R1 b$ g# a/ O - myfree(SRAMIN,pbuf);
! Y) z ]1 c& `6 ? - res = f_mkdir(path);//创建最后一级目录 G2 T+ n* R6 q1 \/ E1 i
-
; ?6 u. Y: _, l# x( s8 P, } - }3 v6 ]7 o) ^' h N5 q1 B7 k3 M: z
- return res;
5 u; C- a1 S6 U6 w0 m% t - }
# g5 |& E) S1 S
复制代码 调用方法:
2 t7 Y, G/ @5 w' G+ ~- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
6 X# ~; n8 ?0 u- W) n
复制代码
8 _9 x0 C' Z. x. I7 s
& D: \7 v; I: D- d4 @" t. i
5 K2 ^0 K: W$ K1 u7 `' O4 g2 S) C, w& }/ v. Y+ e7 z. ?4 ]% K
|
#include <stdlib.h>9 t% I+ M7 r& v5 w' H+ _
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本/ P6 m2 O# X+ F$ x9 {
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值
/*****************************************************************************\( [, y7 v* z% i/ z9 _+ e
函数功能:歌词解析( ?0 ? y5 A/ _- a/ k' \5 x ?
形参说明:_cpLrcPath 歌词路径5 P. }( p$ Q4 G: h0 a: B
返 回 值:0 - 成功 / 1 - 失败
\*****************************************************************************// Y! ]+ [3 [) k
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)% r& t* o- V: n9 ?0 t, \
{
//变量定义( F% m3 Z/ x3 a Z; r8 ?
FIL fp; //文件指针
FRESULT res; //文件系统返回值! M2 |' F, _3 d& A* `7 B1 {+ h
UINT br; //成功读取的字节数$ i! l0 R. \. a5 k% P; [
uint16_t usTime = 0; //用于临时存放转换计算后的时间
uint32_t ulFileSize; //歌词文件总大小; V. z! ?0 l0 ]. P7 I; a/ F; Q
uint32_t i = 0, j = 0; //临时变量
char *ptmp = NULL; //歌词内容指针
char *pbuff = NULL; //用于存放所有歌词内容, S% F' Z9 ?. `0 S
//打开文件
res = f_open(&fp, _cpLrcPath, FA_READ);6 ^" i# _; L% d/ a7 W: c
if (res == FR_OK), X7 w. e. X. F0 o% k* J3 X$ w v
{
//计算文件大小8 S7 W( X) U1 a8 \
ulFileSize = f_size(&fp);$ H9 H) f4 M6 ?! o
//申请空间7 h4 }7 D% W" }4 X
pbuff = malloc(ulFileSize);
if (pbuff != NULL). D+ J" s% W0 n% B2 Z
{) f* U+ }3 [2 j( i1 S( X
//一次性将总缓冲区读满8 v4 k) a' `4 C1 z7 |0 @
res = f_read(&fp, pbuff, ulFileSize, &br);
if (res == FR_OK && br == ulFileSize)- }0 i' K2 I* q) g9 P; a
{) l t0 J' W+ f& c9 {1 W+ p# Q' g
//找到歌词的起始位置
i = 0;" Z) X1 h2 _; m1 o1 r
ptmp = strstr(pbuff, "[");
while (ptmp[i] != '\0') //遍历缓冲区中的信息
{
/**********************解析时间**********************/2 U& d- }' v3 v( y+ c
//[00:40.452]4 G) r" r% ^9 D! x1 y
//[分:秒.毫秒]
usTime = 0;
//计算该行歌词播放时间(秒),毫秒部分四舍五入
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)0 L7 }/ g5 P7 D3 @) M o6 m! i& V9 I$ G
i++; // ':'
usTime += (ptmp[i++] - '0') * 10; //秒(十位)
usTime += (ptmp[i++] - '0') * 1; //秒(个位)
i++; // '.'7 z, E- S9 Q9 c ?- ^
if (ptmp[i++] >= 5) usTime++;
//手动调整时间误差
if (usTime > 5) usTime -= (usTime / 10 + 1);
//保存时间
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
printf("%02d:%02d ", usTime/60, usTime%60);8 r' h! p$ p& O4 O h6 ?+ q
6 V6 w! T* R, S1 y
/**********************拷贝歌词**********************/
j = 0;2 L# \8 d6 F/ i+ z' M6 Y
//让指针偏移到歌词文本部分
while (ptmp[i++] != ']'); ' {) g X5 Z# w& O0 i( L9 \
//拷贝歌词内容
while (ptmp[i] != '\0' && ptmp[i] != '[')
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];
}
//制作成字符串 H7 \) E3 u4 R: ?
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);. ]! o B$ T! }: k0 I% b
g_ucLrcTableIndex++;
}
}3 S1 w& K6 }6 m$ ]
free(pbuff);& _) W2 _2 B! t9 l' F0 H
}
f_close(&fp);
}
if (i != 0) return 0;" M, h$ \" }2 e z0 J+ v" Z
else return 1;/ h( o: p9 l( \4 T% y
}8 {5 Y4 f9 a$ T& t* P