7 N3 U3 ?. V! B5 e& o* I8 X
分享一个STM32移植FAFTS文件系统遍历创建文件夹
; s: T: s$ y; L) B# F* ]- FRESULT folder_create(char* path)
) Q9 S0 ~1 J! z5 K2 ~3 y: K - {# h. N/ N! O0 B+ s& u7 e$ d
- FRESULT res;
) Q$ F1 S1 q& d! s - DIR dir;
8 S4 R/ \ U* w - char *str = path;
: J% E0 [- ?8 t! O& U8 y6 x - char *pbuf;
& i+ |- w6 b6 T* \ - u16 cnt=0;; b, G4 H5 h2 R# H% m+ G q
-
% I: N' g! ^: o - res = f_opendir(&dir, path);
" T( m& J/ }* r( s) K( P( l7 ^( M - if (res == FR_OK)
1 f! T& W2 ^/ M8 ] - {
; f7 \& s6 S, r& m, { - f_closedir(&dir);
e8 v- w8 e+ h8 t/ d- n - return FR_OK;
2 n: a" B. V: u" K - }
% x' A# J4 g, _9 X - else$ N9 P, `" T; N' ~. G6 ?
- {- [/ ^' S# y1 t* a2 W
- pbuf=mymalloc(SRAMIN,200); - p! b2 G8 S$ \, X0 R$ p+ G
- if(pbuf==NULL)
5 Z7 z3 Z) P; R4 J% J2 ~ - return FR_NOT_ENOUGH_CORE;
3 Y ~: v9 K: e$ t* t - while(*str !=0)0 G& |' ]" a1 l$ S- \. B3 h' D, ^
- {5 n! ^/ ?! J8 J( @/ ~
- if(*str=='/')! j6 M: w$ l; S9 u3 d- @* Y
- {* O" \( F4 @$ s7 f0 ]
- memset(pbuf,0x00,200);
* O% K8 l( J1 {* K$ `3 d - memcpy(pbuf,path,cnt); a+ M9 h9 b9 e. Y
- printf("%s\r\n",pbuf);1 T, F- _$ |6 G+ F! Z1 N8 c# v" V
5 K" X# G4 q2 Y& E. A: ?- if(f_opendir(&dir, pbuf)==FR_NO_PATH)
* Z% p) y) p# S- s* a - f_mkdir(pbuf);5 Q- q3 E' ^* s6 Y1 y) c
- else
/ } k# H4 G& W/ N( t2 @( h- N - f_closedir(&dir); & D* M+ N8 V% w/ w! V* h
- }
$ l* ]2 z m* \+ k; O2 j -
, ?) H/ [) l6 O - cnt++;1 C/ C/ T! ?( F/ ]" {
- 8 z" }, _' N+ m- C" m6 e- O
- str++;
) u% X: w# m; v, @/ N - }! s3 j; l7 d2 X! A1 Y K
- myfree(SRAMIN,pbuf); ! F. p, c5 F" I% E' N
- res = f_mkdir(path);//创建最后一级目录
% u' {0 e Z i- S+ [/ c; j -
7 D9 R6 \; c" N. v0 I! [ - }
5 i* X5 d$ W# Q0 v; r" J - return res;& w) p3 P5 ?+ c' f+ G# h
- }6 s' _% c2 n' P6 N2 o7 n* \. G
复制代码 调用方法:
1 f4 F+ t% s2 _- folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
) `: L/ G5 W% c% i u. P5 F
复制代码 , f) h9 o& o' f5 b0 h
! o! r7 N; p" L& ]& F" T3 y Q% g
1 r6 ~% g- Y. t
% }% K* C7 ^* b& F% C( [ |
#include <stdlib.h>
#define LRC_TABLE_MAX 100
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX]; //记录歌词时间& P4 t. j3 m# ?0 ?5 Y# K
static char g_caLrcTextTable[LRC_TABLE_MAX][100]; //记录歌词文本) y( C% D' s2 L1 {1 o2 d
static uint8_t g_ucLrcTableIndex; //歌词"时间/文件表"的索引值
/*****************************************************************************\5 I4 ~$ c+ ?4 D+ q# J6 c+ k
函数功能:歌词解析
形参说明:_cpLrcPath 歌词路径
返 回 值:0 - 成功 / 1 - 失败) Y& w' `$ u$ R
\*****************************************************************************/- L2 `% v. V; l! o9 S
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
{ q( L7 e- C& }. c
//变量定义' U! Z9 x6 G0 r) w. U {
FIL fp; //文件指针% C) m/ H3 S P0 Y, t/ R* j4 h
FRESULT res; //文件系统返回值
UINT br; //成功读取的字节数
w2 z' A6 T% x
uint16_t usTime = 0; //用于临时存放转换计算后的时间0 l& p9 s$ A& k) t! H0 U" R
uint32_t ulFileSize; //歌词文件总大小3 f* J4 P" G# Z# B9 }* o
uint32_t i = 0, j = 0; //临时变量
char *ptmp = NULL; //歌词内容指针
char *pbuff = NULL; //用于存放所有歌词内容
//打开文件
res = f_open(&fp, _cpLrcPath, FA_READ);( k: t ~/ R8 P F- h7 h
if (res == FR_OK)
{1 ^! ]5 h$ S6 B# f: t! V) \' ?
//计算文件大小9 x x' p) v" T9 A
ulFileSize = f_size(&fp);% n3 ?8 ], o6 w2 h
//申请空间+ l l: O- k: X7 g. { J1 X
pbuff = malloc(ulFileSize);
if (pbuff != NULL). A; F1 F- _8 A5 A1 j
{
//一次性将总缓冲区读满
res = f_read(&fp, pbuff, ulFileSize, &br);
if (res == FR_OK && br == ulFileSize)& Z- `/ g- J" }2 f
{6 \% r# N: f% l
//找到歌词的起始位置
i = 0;* V! X" D% r3 X/ a" g2 X% g
ptmp = strstr(pbuff, "["); 9 o* Y5 a$ ?# W l, o4 r
while (ptmp[i] != '\0') //遍历缓冲区中的信息, I, ]7 J% x( ~- F
{! P4 ?. T2 _5 s, p! Q; E
/**********************解析时间**********************/
//[00:40.452]
//[分:秒.毫秒]
usTime = 0;( n; X0 d- g! a/ K, C
//计算该行歌词播放时间(秒),毫秒部分四舍五入, y8 O, C/ e% _
usTime += (ptmp[i++] - '0') * 60 * 10; //分(十位)
usTime += (ptmp[i++] - '0') * 60 * 1; //分(个位)) L1 ]; T) a8 |$ V( M# y
i++; // ':'- C4 z9 c& h: l+ { u
usTime += (ptmp[i++] - '0') * 10; //秒(十位)' ~5 r8 `; J8 N! U- B
usTime += (ptmp[i++] - '0') * 1; //秒(个位)$ T* S0 y6 t: S3 q) H$ `' X, m
i++; // '.'
if (ptmp[i++] >= 5) usTime++;6 D4 C! c' V" M) g) Z5 W: G
//手动调整时间误差
if (usTime > 5) usTime -= (usTime / 10 + 1);
//保存时间
g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;) Y; g( Q- \8 f3 A
printf("%02d:%02d ", usTime/60, usTime%60);! D% d% F# l/ C( G. i
& L& `+ _# g; H" h2 H/ K2 t, l
/**********************拷贝歌词**********************/
j = 0;- J. |6 n% F9 S2 H* j
//让指针偏移到歌词文本部分
while (ptmp[i++] != ']');
//拷贝歌词内容
while (ptmp[i] != '\0' && ptmp[i] != '[') - p- Z% T3 q R n
{
g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];
}
//制作成字符串% N* q( L( K( ~
g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0'; r+ G, V8 f1 H/ I4 x( J* D
printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
g_ucLrcTableIndex++;7 g: F5 a8 g4 S6 v% Y6 `( s9 a( k
}( G) B5 g6 ~' Z( z, Y$ t; G
}
free(pbuff);" j7 l- z6 O, y% i0 W
}
f_close(&fp);. e. n3 @. P3 E/ ?7 t# Z
}
if (i != 0) return 0;
else return 1;
}2 \, W9 c5 N9 ~& m
7 z3 r2 R7 R0 ~8 h