做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。
* W& M# n: o1 M! P保存在SD卡即可。! v/ ^# }3 m8 l% L9 ^
问题是:这个文件叫什么名字?/ w/ ~7 t( u' L
以前板子又RTC可以用时间来命名,不会冲突。
: G1 Q7 [ b! I现在是离线的设备 怎么办?! k' X4 `# B l9 [; u
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt New_Report.txt New_New_Report.txt..这样效果, v i6 V- ~& `% f# m
: @( Z( ]* a/ v/ s$ E: P# ]
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。& S" ?7 Z9 _2 i# J) g0 J. H
! S2 V. W$ z! r7 _; _代码:
& u8 p: p0 _2 G8 B; x1 A- FRESULT fr;4 d" W6 M. _- \9 r; K
- TCHAR str[10];- J7 ?! K) h" k/ i; t( a5 w# j
7 N; x; h% u* S7 f% @/ ~- char name[50]={0};
+ o- F# h9 V( n! p$ w - char newname[50]={0};; F+ D1 h# [# _' f8 L) b( A: H# w
- void Name_Logic(void)//char *name)7 h4 S9 `8 l7 e1 C
- {/ [4 q1 J; ^2 G: Z, `7 j0 G- X' G" M
- u8 rval=0; p( i. h( H3 c" O" Z( B% e
- DIR SDdir;
/ C4 r6 V# \; k# g. M) y- \# Q/ l" c& P W - FILINFO SDinfo;
, P) b8 e5 }- H3 e: v7 T/ q$ ]
' F: t3 @0 d, D4 \# ?- if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹
, X4 [* |2 f7 a+ w) @6 Y6 q- P - {( ~/ X! d7 ^" M- N5 l: U. U. [
- //已经存在 啥也不做
8 X. h/ `! ~: C5 A! t: a - printf("HAVE DIR");1 a+ V! Z u9 o! z% o4 ?8 Y0 u
- }
+ R) c/ z! {8 ~% C4 U2 r - else5 S* h- t9 i4 `3 g
- {//不存在 创建文件夹
1 g* o, S. ?* t. L3 i: r* F - mf_mkdir("TMReport1");
+ W! v% `* y9 {- s) I) O* _( i - printf("HAVE NO DIR");
U- \* R% t2 f/ q; I, C' g2 Q - }
- Y6 y/ w t! W4 b - //准备切换文件夹
, N5 x/ s9 Y& p, j3 \7 {7 U0 | - fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的) B5 I, D* N' ]4 P: z7 q+ W, m2 ^' n
- f_chdir("0:/TMReport1");" a5 y5 |, v3 ~* M' W
- fr = f_getcwd(str, 10);//此时已经切换) C3 i" X+ v6 M; q, t7 O/ l
- 2 w8 o* x/ }, s8 |
- //目录下找是否有文件
+ Z9 t7 U1 U! Z - rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
8 _7 r# `8 K: ^ - if(rval)
C& l! v- ]8 W. c4 h3 E$ h- ]! r - {
+ n \' f: @' w: w2 k* a7 t - Finish+=1;+ D& W z5 L* s
- printf("HAVE TXT");
8 L1 [- i. V7 o' c# q" B - sprintf(newname,"%s_%s","New",name) ;
# I% N) Q* Z2 @+ B. C4 f# z9 M - }- o( m! ?) K, u5 q( N9 @/ ^% K2 t9 d
- else" w# D1 E4 f1 T! y0 z ]
- {7 K( Y7 m5 G: I) F* Y+ l- i
- Finish+=10;
& V0 \* H" K/ B8 V7 y" k - printf("HAVE NO TXT");# Y$ @5 q$ W2 K9 ^
- strcpy(newname,"Report.txt");6 O& L2 R* w) k: C8 ]: ]
- }9 C! T0 z8 }2 D6 C
- f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了5 V( `$ ~9 g5 t
- f_close(&fil);
5 D( ^$ b; B2 a7 o: ], L - }) O/ C$ M0 V0 q7 l* o8 a% z% A
复制代码
8 S. B# ~/ O1 M# U3 L. Q& D# C+ ]. V; _1 O; j: M
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的 + \: a+ F( H$ r$ J1 A: C% Z- Z% S5 u
主要调用的2个函数是在库函数修改来的。
8 A" m6 O% T% @1 M4 Y. a一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的6 @& h/ y e R- ~$ F' m/ ~. C
- u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname) 6 y+ Y0 B' g7 X; P/ w. j% L
- {# Z& x8 _- ~5 s$ }* h
- FRESULT res; 6 ~/ G# u2 j# k6 n( {( D& m
- u8 ack=0;
% j( ? I1 v7 X I - char * location;
9 ?# j: K# l* { - char * target=0;
Y! Z; M* w; u% q8 y% x+ b - char *fn; /* This function is assuming non-Unicode cfg. */
' c1 L/ C# E$ J
( d1 J7 @- K3 J# y( B9 M+ h' R& [* i- fileinfo.lfsize = _MAX_LFN * 2 + 1;
0 J4 ?$ p9 e W& B1 N4 q - fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);, l( j4 p: K7 V# k
-
$ _3 C P, I1 I( F - res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录/ S& {8 |6 N B \* r7 G& h
- if (res == FR_OK) . l1 d" W6 c0 e. A
- { ( l" s2 f; W/ @8 Y. w
- printf("\r\n");
" K( T9 b6 `$ Z& q - while(1)
8 F% k9 v$ P( s4 e - {
3 n6 X% b% s( n6 J$ p - res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件
) y5 ^6 W3 ^, ~+ N/ C - if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出* H8 z% D9 ~9 ]
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;- g' R$ B3 |* L
+ l- V% O6 W/ B& b$ n6 k0 ?- printf("%s/", path);//打印路径
+ d& l- I, V, C" V- F - printf("%s\r\n", fn);//打印文件名
; K+ p( J4 y0 r9 [ - location= strstr(fn,name);7 O# @! [9 Y$ n& P3 C) g1 D2 W9 j
- if(location&&location>target)
$ e5 @# W& H) p/ U - {
6 v$ x( T" h% @/ ], H - ack=1;* |1 h3 q- k8 Y* v* D$ x
- target=location;: G& } M5 }' v$ b
- strcpy(Targetname,fn);
$ N. ]" Y1 n$ K, V - printf("update!!!\n");7 F/ s& b8 d! C8 z# l7 X
- }( w6 |; ]& W. B4 g0 l: h
- } 6 m5 |- P' S# M+ d
- }
% Q5 {# r6 G' R7 ]* M) r1 p. N - myfree(SRAMIN,fileinfo.lfname);- `& d$ D _' u* H4 a: S% p9 r, |
- return ack;
( L6 J- X, n1 S* A7 r5 y- C - }2 {1 F; h+ r, P$ h
- 9 \- o. ^* a q- I" w
- u8 Check_Dir_Exist(u8 *path,char *name )
* i/ O, j4 f% C9 d - {3 O, O; j% o$ q7 C4 f2 N
- FRESULT res; 5 B" P: a& q3 h. B
- u8 ack=0;
' T4 X1 f: |) ]9 E: p+ M, R - char *fn; /* This function is assuming non-Unicode cfg. */
4 m+ B/ q% e0 q; \! K9 T
# M1 G. j, ^- g$ n) X: _$ j0 V- fileinfo.lfsize = _MAX_LFN * 2 + 1;
8 l/ X: {6 t6 _! {0 Y - fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
$ T6 `/ ~& Z$ l -
: {- o& [' }( y1 Q - * E; r0 Z& O7 L/ _" m( J" U& h
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
# d1 a! {0 K" C2 M% I - if (res == FR_OK) " n( T1 ]( a. ]$ r2 K, C. @) m' B
- { O9 M; G5 V6 Z# X% s
- printf("\r\n"); $ z2 S3 q) k5 R) b" @, j& l
- while(1)
, A+ O8 g; G2 m* t% A+ ] H' | - {: N1 t$ x6 A% {1 c3 z7 r% e
- res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件
* e6 v% y0 m8 Y T - if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出+ v' @4 z. N' G" b$ M S
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
+ A# s% D T# Q( U" b - q$ s- W) C/ R3 ^- m) Y$ P
- printf("%s/", path);//打印路径 @6 o! U0 ^5 f9 H" C- C
- printf("%s\r\n", fn);//打印文件名
3 }4 x' k9 G/ r/ C4 r2 T - if(memcmp(fn,name,strlen(name))==0)
q( |4 i! y D* X - {3 h8 `9 y, P9 e* w3 [+ `* Q
- ack=1;
% P r2 ?# s2 d - printf("Dir_Exist!!!\n");
! Y' v( h; z$ @5 q - break;
" K2 l" y* }3 H# `$ ]8 U! l - }
, s. Y( x- r+ i/ V; ~! u - }
# X# |+ _' {* ~* F# w# F# |; ` - }
) {9 g2 D% R# x# S, m - myfree(SRAMIN,fileinfo.lfname);9 X4 F# M$ i2 [$ U/ t
- return ack;
& H- C, y! P U' y' e - }( P' D/ V& \1 ]! i" t" H% J6 `) b
复制代码 希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
" h) V, Q0 U' A0 W0 | |