做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。
" t' V: B) o4 E) m! Y' K. W保存在SD卡即可。7 B! o. k- r+ N; s8 N' m% [5 J
问题是:这个文件叫什么名字?" G% g$ W$ `* X0 r; F1 s
以前板子又RTC可以用时间来命名,不会冲突。
( ^/ e9 n, B# `5 w现在是离线的设备 怎么办?* i- b7 @0 h, C! |8 N0 ]
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt New_Report.txt New_New_Report.txt..这样效果
" W: @+ J! N7 |6 Y4 `
" w2 Z0 A7 Q& o9 E Q
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
) m8 Y3 B" A) q5 O
. u1 Q4 ~4 }0 R0 C) Z
代码:
" b/ [( G2 t4 o9 U- @( S1 Z4 [- FRESULT fr;
6 H% ]6 T; R& ]8 i - TCHAR str[10];: e* S: R0 J: }% L8 U& z
- # T" k) ]! |: [# M' I- x
- char name[50]={0};
2 G% N: b, Z4 `6 w - char newname[50]={0};3 W' K {9 c- q {' |
- void Name_Logic(void)//char *name); z. F+ Y) ^) y7 P
- {
' C# w$ L" j2 ~- U+ O - u8 rval=0;) |; D- b; T' H3 O. o7 v5 N- G
- DIR SDdir; 5 ?3 J, U4 {) s
- FILINFO SDinfo;
4 O+ `+ W+ \0 ]- F. X$ O; { - 3 y) F# v5 ~; |% R; y0 k6 ^
- if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹& \! j1 E6 {# a$ q/ K2 L
- {" ]( V9 m) y8 s4 f% [
- //已经存在 啥也不做2 Q) t5 {8 X0 o# c/ b& [& s' D' n
- printf("HAVE DIR");
. b5 b. u6 R+ Q( h6 \- \: g - }! a* G) l1 b% j% P' D
- else
L( P/ t, G9 n. @1 @6 \; q - {//不存在 创建文件夹
( q& {+ {7 e3 S3 N - mf_mkdir("TMReport1");6 W4 R% ^" G+ b n% e
- printf("HAVE NO DIR");
/ C2 L7 ?; A& I - }
/ e( g2 U" g0 r1 c0 d - //准备切换文件夹
4 l4 H+ Q' Q1 i7 m$ K5 z - fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
5 W5 F2 A7 E. D. x - f_chdir("0:/TMReport1");
5 C5 e6 V. O* G" K5 t - fr = f_getcwd(str, 10);//此时已经切换
0 O# i; K: t/ J0 a4 f7 G* r4 q# a - 5 T, v1 Q- v' n+ a0 y* T
- //目录下找是否有文件
* T4 }+ X/ _# V) I' n - rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);2 }8 T% o. O' i2 S# }7 ~3 h8 q
- if(rval); l& F S3 s' k
- {* N$ w6 U# ?. L! G
- Finish+=1;
) C- K6 q3 h* h) @# S3 e2 ^( z - printf("HAVE TXT");
1 w1 z6 J( L8 ~) _( r! p - sprintf(newname,"%s_%s","New",name) ;! `- [9 Y2 h8 [# x7 ^
- }9 }1 M: Z( [6 z. m- K
- else
% \* M: ~% V$ B- ], _ - {
1 ]) c! c: K$ F/ P - Finish+=10;
1 v' x8 c. q5 _ \6 U! ?$ } - printf("HAVE NO TXT");2 p, Z5 D; m4 H( C2 A* H9 U
- strcpy(newname,"Report.txt");% R- E' M! y u
- }% y+ _' I$ z" P0 O- M: L) p
- f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了' d# S- J9 ?* J& ~ V
- f_close(&fil);
3 L. p2 E/ y! p% y6 n: Y6 B/ }2 E - }
4 u `7 T- D0 \" P" w! }! ^6 v" U
复制代码 9 v8 ~5 Z3 W" n
0 B( F0 H' W, d& c- b# j4 j
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
: f/ X0 k+ c+ z& t: I' f& b主要调用的2个函数是在库函数修改来的。
) M+ L' }9 M+ I: n, b一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的9 @/ p, n/ h2 ]7 b+ D P& z
- u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname) 7 a% P. D/ r7 E
- {! G% Y E. D# ]
- FRESULT res;
@2 E( q4 `7 L7 l5 c7 h+ p - u8 ack=0;5 j0 X' J( F4 o" _' P
- char * location; - F& e$ }# J: Y
- char * target=0; ) ~8 G i- J4 q. X
- char *fn; /* This function is assuming non-Unicode cfg. */, [+ T7 Q8 M2 V# |0 h$ r0 e
- & l& Y# y& x: |" j8 V7 U$ [7 h! u
- fileinfo.lfsize = _MAX_LFN * 2 + 1;# z; M# K" K' t. F N1 D
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);8 k0 @6 X; M) s
- }' K6 f3 O: q! c4 c) V4 k
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录# b* ^) s) a" g$ s
- if (res == FR_OK)
. B. q$ E; v+ {% h - { 3 @2 c* a/ C/ V; j4 A V- ^3 \
- printf("\r\n"); ! k7 V6 Z5 u7 P! i3 H9 J+ p
- while(1)
# E; c) a4 @# w' B4 S - {
' o: e- j4 Z$ Y) s+ R - res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件5 Z. |' ?! [1 R2 ?4 ~0 o5 R! o# D/ P
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出. l' C. b9 W4 b$ W+ \- \1 q
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;! `8 ]( @+ h5 V
) B" X: f6 G( c4 o& l% B& C- printf("%s/", path);//打印路径
: s. x$ H6 f; O- C" { - printf("%s\r\n", fn);//打印文件名
$ P' @1 v# {4 T! F1 M5 L - location= strstr(fn,name);5 A2 c* p; r9 ]5 F7 y& q2 I
- if(location&&location>target)
& E4 a! S: D% j4 X7 h - {
9 \$ i- R: V* q3 D! q - ack=1;
- X, D5 D$ {% y - target=location;9 J' e% S# `$ z M. S& ]
- strcpy(Targetname,fn);
) T$ o0 Y) G( k - printf("update!!!\n");
& d+ J6 u6 d3 E* }- ^$ A5 X - }
: j, [8 w( w# V1 i - } 4 S/ E% k- a) B: h
- }
7 j: M1 k6 f; e, I. C" }: j - myfree(SRAMIN,fileinfo.lfname);6 K# ^) G5 n& {) D& _3 u
- return ack; 0 x" r9 a/ Q1 g! Q$ B
- }
6 n( q( ~4 h( ~' X$ W# y0 z- ~
8 P' \9 m7 j$ b0 T- u8 Check_Dir_Exist(u8 *path,char *name ) " N& {6 r7 M( q* F; r6 A3 g+ D
- {+ o+ J9 b5 `: w% U/ x2 D
- FRESULT res;
( m" R5 S1 H) \- V" Q8 K - u8 ack=0; - M5 n" f5 H3 Y7 r! v
- char *fn; /* This function is assuming non-Unicode cfg. */9 I$ Z+ q3 D( P, C
5 u, P2 }. [/ j: b# T- fileinfo.lfsize = _MAX_LFN * 2 + 1;
" [: c9 B/ o: a- c. m! O, ` - fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
* b9 a' D7 ^$ Z% | -
7 I B5 }! [/ q( o
4 Z+ X) [2 c8 v# e9 Z. G/ S6 J+ h- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录- i. V+ _, w9 i7 R6 O% g
- if (res == FR_OK) + Y/ t9 y: C$ c( ?& [- K% t
- { ) X. v' T. |1 A1 P% Z: e
- printf("\r\n");
9 s8 ~' H! K3 f' O# Y - while(1)$ P* U( Y+ U( c1 E$ R& u9 D$ |
- {
- f; k, l5 P% K r - res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件/ T( @+ }- @+ R2 G8 F
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出, T0 _5 |* N {) R! K! Z5 M
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;$ w) p) W$ h+ e. B$ b) x
3 I+ ?5 v( t ]1 i! ^- printf("%s/", path);//打印路径 z+ i8 h, V- f9 ?$ ]1 c2 @4 j( ]
- printf("%s\r\n", fn);//打印文件名 1 D2 h. j0 C2 @& w4 Z8 Z' O- e
- if(memcmp(fn,name,strlen(name))==0)
- @. p. X/ W7 {6 r# N - {
! H n8 r) k# W; |) M/ n - ack=1;
6 M3 N1 W, ?0 N - printf("Dir_Exist!!!\n");
9 c9 M5 \' g3 H! q. P6 z$ b - break;
! |! s1 N& j" b, o* j, r# | - }, h5 K" W3 M5 ?) O2 E; C8 }5 c
- }
7 ~, `2 l0 U6 j1 @ - }
2 w* C- D# x5 D% ] - myfree(SRAMIN,fileinfo.lfname); c! a. Y+ o {3 A/ h/ s4 K2 o
- return ack;
h2 L, t" w/ g. B! H4 p; U - }3 r5 i- i3 W" `( Q5 l$ _8 l7 c
复制代码 希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段' m! j; ]8 z2 I
|