做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。
& `' W: ~& V+ g3 x5 A) {6 ~& \保存在SD卡即可。
8 ]+ _ ~: Z* Z- `* b' { o问题是:这个文件叫什么名字?3 g$ _8 T- A" q/ Z
以前板子又RTC可以用时间来命名,不会冲突。) m7 u' F% F n4 L! e! ]0 e
现在是离线的设备 怎么办?
?' Z M* X% e( i想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt New_Report.txt New_New_Report.txt..这样效果5 n& q1 m+ Q$ E. u9 I0 Z% w& G
$ G7 Q5 f, O+ m7 l思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
+ v" N6 P: ~! S, j
5 e( J% B+ o& s. ]4 T: m
代码:8 j2 v$ B# k- G, G! K m, [4 h
- FRESULT fr;
7 Z; d a1 l+ H! z. J - TCHAR str[10];- g' ?( ^6 Z3 w3 E& L% ?# Y
; Z Z& e) d: t+ J) C, }- char name[50]={0};; `2 }" r$ |7 q
- char newname[50]={0};- S/ H0 j' I: d2 h% ^, j
- void Name_Logic(void)//char *name)
/ C/ D% T" S4 Z6 |; l7 j - {( g$ @$ {, J" T8 u7 b0 u+ ]4 T
- u8 rval=0;
" X3 a& g( T9 T0 _; @) x# G - DIR SDdir;
% l' U: y5 T: a, X: Y( ]# F4 k# R9 B - FILINFO SDinfo;
1 p- @' N$ f! F8 D: U - : S" t1 w. [: ~# o9 g
- if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹. g7 x4 _ N1 b# |5 g
- {
" y; v& I, W$ H$ E: P y3 I( B - //已经存在 啥也不做( ?: h* u* k; d+ W1 O
- printf("HAVE DIR");3 U+ L4 r+ x* S5 `% h
- }
6 H% M! U( R! k) E - else8 w; [' P4 o O5 l! @( S: l
- {//不存在 创建文件夹. B% e6 @+ s, ~! {3 B) }/ L
- mf_mkdir("TMReport1");
) L8 v9 B6 D0 q E+ C - printf("HAVE NO DIR"); 9 k! X5 b5 l, Z6 z& i* ]
- }( {5 B/ q5 k$ C& ]- M7 g4 i
- //准备切换文件夹
6 c1 w' C/ m! G# ~ - fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
( w( M1 s( _# C- W: N m - f_chdir("0:/TMReport1");' x; v+ o# k4 H% Z5 H
- fr = f_getcwd(str, 10);//此时已经切换
% t0 u2 V- P) C2 g" \! K, D/ Z% [ -
2 p* I. O5 I* j6 s - //目录下找是否有文件 W3 E/ c$ t2 g# l5 I2 \- y' i8 C
- rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);6 E% L# T/ B: Y* m
- if(rval)
+ x) u7 n% |& Q) g9 G - {6 a4 H) S8 ^2 Q; @: F$ C$ @4 F
- Finish+=1;
# j, i, c. j' \: ]6 E - printf("HAVE TXT");
1 U: l; z+ s% n5 e, Y- `, D5 H - sprintf(newname,"%s_%s","New",name) ;0 b) D/ h) p7 l" }; y; S
- }. B0 A4 j% {; o2 }; f2 W
- else" ]" O$ p0 E5 ?5 K
- {
# K p- n( {, ] - Finish+=10;/ R! X1 V- s% |3 `! N# x
- printf("HAVE NO TXT");- X N: D- d% T0 v. m& z
- strcpy(newname,"Report.txt");
% A; m0 v4 [" V$ B* B3 s4 }+ Q! E - }
4 `+ x. s' b- m& w0 H - f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了8 o" ^9 Z. c. b M; t _: l6 {& q
- f_close(&fil);
' J0 U' H& {) c; p - }
$ o8 ?, r1 U% B- K
复制代码 ' s& ~% m1 m* r+ ~
$ m- E) q3 s* ?; v8 A' P. _( K9 p; Y5 q/ s看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
9 a7 D7 _- g! R) _) m! {" c: ]主要调用的2个函数是在库函数修改来的。
& V8 N. X% [9 ^一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的0 Q- [0 H3 B0 |% v7 l
- u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname) 8 c" ]* G6 V/ ^$ p9 t6 N$ i
- {
$ R) h; f& l8 O! j - FRESULT res;
2 @8 V e0 m' g g( Q - u8 ack=0;' ?" u- v( v% W" d' g
- char * location; 7 I! e; _' V2 U h% C/ c$ n
- char * target=0; ! u" q: V& d( Z9 P: y# U1 v
- char *fn; /* This function is assuming non-Unicode cfg. */( @2 I: g4 O7 C3 d5 P, ?
- ) d" S% O) @* f2 W% e( H
- fileinfo.lfsize = _MAX_LFN * 2 + 1;
4 k1 Z8 m* r" F- D5 `- W - fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);2 J2 ~" A$ [/ I1 B* [- m) f- g
-
l7 W+ V+ B8 {- n* V. P - res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
+ }3 P6 d( }* p8 m- X6 G - if (res == FR_OK) % R Q3 \- _( z- ^; f5 h! y5 O
- { 3 q l; n7 b* U
- printf("\r\n"); - y5 h. k8 \" U! f- A3 ^5 U
- while(1)
/ x7 f$ E- e7 C: \, f; i - {
1 o4 G& }- G7 Z' _' Q - res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件7 v. k# ?0 ~4 d. f, f3 E% ^4 Z
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
' E5 S; f! B1 v% @ - fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;$ D7 l2 }2 s Z
- ) ?1 V& d# L; e1 {+ B; Z
- printf("%s/", path);//打印路径 9 N/ Z$ s/ Z2 `
- printf("%s\r\n", fn);//打印文件名
; {5 S. c. E2 t8 _/ @! t; G$ H - location= strstr(fn,name);
( [# }- {5 |) x; U* ]5 Q! R - if(location&&location>target)
0 m# j2 F1 n9 n% h6 X - {
5 ?, Q3 T5 c( k$ ~* h; v) z" O - ack=1;0 m- \6 s) G' Y! X* |. A2 W- A* V
- target=location;+ |' X) w! ?$ E, P; g& @
- strcpy(Targetname,fn);
, @; T# t _* A% ?* c - printf("update!!!\n");1 O+ ~8 I4 ~7 i$ y( Y
- }
4 D7 _2 [0 `. U9 j0 e! G8 O - }
! C I, Y; F# ^6 f! y0 [: x - } ( e0 g3 H1 p$ c7 _* x
- myfree(SRAMIN,fileinfo.lfname);" G& F( D1 ]3 c6 J7 |. W/ f
- return ack; - ]; R2 i; o8 \
- }5 f% b* h3 i3 V+ a9 k
- % z3 Y! j" P* i, G
- u8 Check_Dir_Exist(u8 *path,char *name ) ( |" n4 x5 a, H! O: f. |
- {1 E' J( l% ~) j+ S) R
- FRESULT res; 5 |' Z6 M# m. j9 \
- u8 ack=0;
& c2 P" d; B) o! x; X - char *fn; /* This function is assuming non-Unicode cfg. */5 y& Q- J, e) c# M
- $ t* F( M. n1 D" M. C
- fileinfo.lfsize = _MAX_LFN * 2 + 1;4 p, v# b8 B! H! G6 X
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
2 h* [3 F& X/ j+ b+ h# C3 l -
) A) i1 s1 P$ v# R- H9 I' ^% x - ) t: G$ A( q1 e% F6 i+ t# c0 }2 n) B J
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
' {" j; Y& J7 L1 n - if (res == FR_OK)
7 t# b5 M- Y1 e8 ~9 s, b: ~6 e - { ( ~! y5 I- ^8 B% R* O$ B# w3 H
- printf("\r\n"); " Y; M; L; ], Q1 _6 h t6 P! a% ~
- while(1)6 ?/ n% M7 f; T1 {0 R( q! B6 r) V
- {2 u& ^3 D; D* A7 e- M
- res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件
- j4 }$ u8 C( r0 F - if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出! g/ {+ G2 Y* X8 e
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;! V9 d5 B* H, p0 Q) `
# x* Y- L, w# F/ v$ ~" c# z- printf("%s/", path);//打印路径
! D1 f, }( H/ S4 A1 ^ - printf("%s\r\n", fn);//打印文件名
) u& y* y# m2 G# W e! K Q - if(memcmp(fn,name,strlen(name))==0)
4 N- D; W0 q4 F+ e X - {, t- l0 O8 T; b1 H7 t
- ack=1;8 p( G8 t* c5 k/ u, N) ?& X
- printf("Dir_Exist!!!\n");
' h/ [- A+ m9 `' V2 ?+ C( Y - break;, [! R1 z4 C5 m8 _
- }
% B' M1 S w/ O: W9 l$ K0 q) ^ - }
; y" w* ~/ e, C, o/ i5 ~( W- @ - }
3 Z& L; m& d! L; h2 T* m4 r - myfree(SRAMIN,fileinfo.lfname);
- j! G) c" x0 U7 p2 H4 ]/ V% Z' L; y - return ack;
: z$ C( u' X A - } k! B8 \# c3 A! G
复制代码 希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段& \6 q6 c/ b$ m t! d
|