做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。4 O- \8 t2 z7 T4 P, W1 J$ ]: n
保存在SD卡即可。
: `6 ]! | H( v" m$ H/ ^5 Q) W! X问题是:这个文件叫什么名字?& Z# \# V# l `6 K
以前板子又RTC可以用时间来命名,不会冲突。
3 g- m/ b* C, D7 G4 E现在是离线的设备 怎么办?
1 s* O; }) k- P想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt New_Report.txt New_New_Report.txt..这样效果
5 U4 y ?' C- j: p& A
* U# g4 y; m& a% c0 p {
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
P. e, |$ n3 R6 ?7 [$ V- ]! O: c
# T) n4 J3 {% u* N
代码:8 m- F$ g4 ?. c, ]6 z1 I; B2 D
- FRESULT fr;
/ Z3 O& U2 J( w7 t F" l" O - TCHAR str[10];3 {, n' I g3 @
% i% U [7 J& N) i8 w- char name[50]={0};
5 o; P8 ]8 [( v8 i6 n0 T. p; F - char newname[50]={0};( v- W/ H0 I* d7 Z
- void Name_Logic(void)//char *name)
$ f. e2 t( q4 z( ?3 \5 B5 o& U - {. i' o. I) \7 _
- u8 rval=0;
$ v7 J- u# y8 K5 z: k% e" p) T4 D - DIR SDdir;
; _6 |% W( x5 i0 @& N% o. s - FILINFO SDinfo;) E5 m) Z: T h1 X: s! v! m
$ X2 w8 t0 [8 Z8 A O- if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹
" w7 h$ N/ s& v! h# n - {
9 i& g) y/ \8 R4 d8 f5 D+ x B# N - //已经存在 啥也不做
2 m. [' O# m9 i; w - printf("HAVE DIR");" s! [" ~ o& ~. O' L3 X4 r: ]
- }- s1 s. l7 w5 s: _ {3 Z2 f
- else
& P. X7 M0 _, _" {' G } - {//不存在 创建文件夹
$ q0 m; Z$ Q, m. e - mf_mkdir("TMReport1");, z* f, H) c9 _! d
- printf("HAVE NO DIR");
" L( W1 S( F5 w# z4 w( j3 Y - }% t! q% B9 [' u8 k
- //准备切换文件夹4 I/ p7 [6 b9 b$ G3 N1 ~
- fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的, ~8 X1 |. O7 H( d W& b
- f_chdir("0:/TMReport1");; n' h4 F- X$ g4 n: I; ?* X
- fr = f_getcwd(str, 10);//此时已经切换; \0 M- @* w+ q3 ]' b
-
' ~: ]0 ?8 q+ N7 o: M, W+ s8 I8 l - //目录下找是否有文件5 F) ?, _0 s3 ~, q' Z7 R2 K
- rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
/ d- k* [; g) O0 Z/ V; @ - if(rval)
8 l9 G" R4 |* _' |* D" v2 a/ d4 b/ j - {
' s# n# X$ p; Q6 c& z9 b$ V - Finish+=1;
% o- P6 _6 x }( T; X! c$ p - printf("HAVE TXT");: a5 k5 d1 x; A# E$ t
- sprintf(newname,"%s_%s","New",name) ;
; @3 r& u8 P, X3 v9 ~- t - }
1 E& N6 N ~ p7 V+ J# U: B) u8 ^* k - else1 c& E: ~' |- z l' H1 @
- {. ~9 i3 t: k" d! b K$ N
- Finish+=10;# V& R) k$ M5 l- G
- printf("HAVE NO TXT");
( t: a0 V3 N0 h1 a" q - strcpy(newname,"Report.txt");: U5 X1 L3 J' E( G" N3 S
- }6 r* ~# L, R, c- y
- f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了6 j& B+ H% d8 S: w
- f_close(&fil);
# e- J N9 G$ U8 a - }5 k+ b9 Y$ c& m
复制代码 - I! @# d+ N6 a2 _6 l# X/ F
- ?- z2 }3 s+ h3 O( B- M
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的 . ^. o! D: f7 `' _: u: ~; i0 Q
主要调用的2个函数是在库函数修改来的。% Y! `1 ]6 W Z" ~
一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的* C+ P/ @; o8 I
- u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname) 3 v9 X' Z; T: o# j, K- _3 Y$ ?+ l
- {, J, M* a( ?$ G2 T
- FRESULT res; ; B* k3 c* \8 m/ `8 G5 S5 {% o
- u8 ack=0;+ G' J6 N) ~# b1 _7 F6 Y2 L; n
- char * location;
1 \1 R# `3 S/ }, F - char * target=0; 0 l; X- j* p7 ?$ b
- char *fn; /* This function is assuming non-Unicode cfg. */, q8 s/ ^/ }( d8 ]6 h @
- ; u; F) m. R$ N+ G7 ]* `
- fileinfo.lfsize = _MAX_LFN * 2 + 1;; P2 C& e& Y! E$ g6 }! c
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
: C8 }5 I, ^) e5 A! c( O+ c -
5 Q6 a( \8 t2 M& w; u - res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录; l: ^& V: ~8 g+ d' {: P
- if (res == FR_OK)
, d( u8 i; b4 h/ C - {
0 b. C; f8 o7 G8 D0 X" {4 D - printf("\r\n"); ) l$ A3 u. ?0 n4 M" T
- while(1)
% R, A' @7 Y! s5 u5 l - {
- @! T0 s7 x2 e |* c - res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件
w- O6 c6 z0 {' [8 | - if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
+ U& d. R/ ]7 h. @# y1 |" C" ~0 @ - fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
0 Q4 j }) _, Q$ o) w3 ] - 5 m5 E5 D8 q2 s, L& M0 R
- printf("%s/", path);//打印路径
, q# q3 v: S y# R6 } - printf("%s\r\n", fn);//打印文件名 7 E# W% K7 |' @3 q, P' v0 [ y
- location= strstr(fn,name);
/ X9 N/ @ L* T) B' B s( S - if(location&&location>target)4 Y$ ~. ?3 d* f$ y. O I" M- ]
- {/ Z+ ^7 ~0 V0 A2 A
- ack=1;
/ d8 V% H( x. c( N V( b& V - target=location; P) J1 S1 l" Y$ I4 E4 s
- strcpy(Targetname,fn);
& y4 ]. Q# Z* {5 T M% B, W - printf("update!!!\n");
( v) M9 j( ?5 F: ^3 ^& y6 s) } - }
6 l {, S+ Y. c* F+ F- Q - } $ n5 S/ q5 O( t
- } ( q5 L8 ~5 u8 K9 X- p
- myfree(SRAMIN,fileinfo.lfname);. W8 j9 w' f2 e4 s X5 u
- return ack;
6 k" K: N9 a5 f! E - }5 |/ z% P- ~3 s; |! ]4 g
2 o6 X( A2 d& Q- u8 Check_Dir_Exist(u8 *path,char *name ) 5 e" f5 n: ?' I7 [5 f* w
- {, e1 v( \) N$ ~: m
- FRESULT res; / G% Q- n: t# X3 `2 \ S
- u8 ack=0;
F3 \8 {! d$ Q, h1 `) C2 ] - char *fn; /* This function is assuming non-Unicode cfg. */- T( d5 e6 n% J: i5 f( ^/ h
- 2 `0 P- p+ ~& e3 F9 ^+ A) C: n
- fileinfo.lfsize = _MAX_LFN * 2 + 1;# m9 B. `2 D6 r: B. j/ ]
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);8 b' s" ]( |1 ]8 u. g
-
) Z( j" { g# O: S
$ B5 L. ]* B4 I; ?- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录( W, t& h2 n" Z5 R& p
- if (res == FR_OK)
5 `( [" V7 j# p4 P9 }& o - { 0 \8 G8 P3 V* y& i$ m8 j
- printf("\r\n"); # p/ o3 Y5 f/ y# ~. x4 k
- while(1)5 ]6 [" f% r# \9 R2 }5 ^$ _- w
- {
; X) D+ O& H" N2 @. y4 B( M - res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件. Z8 @1 n. _# s" u! K9 n
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出9 f; w) y. T- d. b( E' E
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
, {! U( @+ G8 a( Q% }& m1 a; @9 X
. w) d m- |( _4 Z- printf("%s/", path);//打印路径
; p% U4 V( t! { N3 } - printf("%s\r\n", fn);//打印文件名
1 S+ l2 _* z9 T) c/ r7 T8 d, U - if(memcmp(fn,name,strlen(name))==0)
& A7 O- _* M! [5 X, Y. C - {- n/ k8 V6 [% x: u2 S" r
- ack=1;
- ]0 a( ^: ]+ T2 } - printf("Dir_Exist!!!\n");: e6 @ H) M8 n2 T0 n; w0 A+ b
- break;6 C0 t7 N7 h/ \4 l
- }4 H' t3 M% h/ h6 b- F; X# M& K
- } ; `$ _# k; f& e* |0 l* R: K
- }
( w; ^0 L# X! R9 h9 R - myfree(SRAMIN,fileinfo.lfname);9 l3 O% V7 p& D% P5 f* [' K1 |
- return ack;
& q, [6 T/ s5 v3 h: f7 p7 o1 O - }
$ C! Q8 G+ F% |1 q$ `2 d- E8 T
复制代码 希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
' O ~% f' N, w" s4 k |