做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。# P0 W; ^) m6 J: S' ?1 D
保存在SD卡即可。; C/ Q* h/ S6 @& Q4 O
问题是:这个文件叫什么名字?2 W5 T7 R' L- l; l- X* }
以前板子又RTC可以用时间来命名,不会冲突。3 a5 i1 z& q8 l2 P' B; F, q
现在是离线的设备 怎么办?* M5 s5 J5 K9 W; @* s
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt New_Report.txt New_New_Report.txt..这样效果' m& K/ a- P" i6 g* e2 a R6 u. `, f
. R8 G! P) l0 Z! [- G
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。- J, l1 Z& k% M8 y9 a7 C7 `
2 J& v/ _: F; W4 x) ]) t
代码:$ B; G# Z8 h% U6 W, k
- FRESULT fr;
+ O8 o' S+ [0 N - TCHAR str[10];
7 d$ ^# p) L+ a, i% a1 G* N0 p# D
8 s+ L& u, N( [) F0 l2 b( G5 c! @- char name[50]={0};
, N1 q# G& @7 l! \' l& U% b - char newname[50]={0};: g/ Z' |* L& D- _3 w0 G$ A% s
- void Name_Logic(void)//char *name)
8 r' Y. l, g8 l/ `7 a) ` - {- {! J. m# H' }" d2 U3 y0 ?
- u8 rval=0;; f6 L" c2 P$ N! Y9 R* n9 ^, q
- DIR SDdir;
: e* a8 o' [% a, k8 B, Y - FILINFO SDinfo;
L/ E# M8 H$ E4 `: i8 S9 z
& q1 T+ v0 A3 c1 p* ?: F0 @- if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹1 l9 K1 \1 n6 a" @0 }' x
- {: k! X& ^7 V) F- S8 l
- //已经存在 啥也不做9 \3 Z: a7 E7 {
- printf("HAVE DIR");( c) Y. N' y* O6 ]5 R/ @1 h$ r
- }
4 t6 J( M; F! n6 r! M$ ~! p5 a7 C - else6 k0 s: D$ s ^
- {//不存在 创建文件夹; @' r6 q/ x5 r$ R' Q
- mf_mkdir("TMReport1");* [. N& j3 t4 M0 t+ |
- printf("HAVE NO DIR"); & \4 `4 O1 b, U+ Q! k" t3 G6 r+ }& @
- }
6 C% ^4 ?2 y0 g3 E% n% Z2 A: ~& Y - //准备切换文件夹
" e5 W+ x9 ?: T) Q( B3 H - fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
+ }, F) y# G1 r( h! ?* V - f_chdir("0:/TMReport1");6 G6 E9 q) C1 v) W: L; A
- fr = f_getcwd(str, 10);//此时已经切换
; ~0 p9 ?# d! M% _# { - ! q( B9 `# d# k% C' `4 d/ q
- //目录下找是否有文件9 ?" ~0 w% m! a
- rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);! t+ L5 P9 ?: X
- if(rval)
5 }/ g4 w, Z' M8 L6 B, t4 u$ S! H0 b - {
9 F, W6 i- n- }7 p( z! I- z - Finish+=1;
8 w8 l# ]4 i/ \4 z - printf("HAVE TXT");6 _2 K0 @ V8 x! R6 n. l8 `+ h
- sprintf(newname,"%s_%s","New",name) ;$ x) u" J- S2 f# C! N' a
- }5 y- S4 r( {5 P- B; z0 [
- else5 D0 ^$ G- n, t4 O- i1 m' [1 P
- {' ?) ?+ ^9 @! j$ l; l5 e) A
- Finish+=10;1 X Z! E5 Z: B' ?+ b- `3 C
- printf("HAVE NO TXT");
5 r$ R( Y/ [, U6 b5 M - strcpy(newname,"Report.txt");
7 F" ?( A; C" I8 e - }
; h( j2 d/ t+ w# ` - f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了) ~! g* C) v2 j: ~) y
- f_close(&fil);
* o% B; o1 }2 ?* @ - }( e. X/ S5 Y1 `8 w3 m
复制代码 . b% q/ i" O1 r7 m6 q4 W+ v1 T/ V
; F: G6 V% T3 J2 j+ J' h
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
1 Q4 m* ~! y4 r0 l( I6 G主要调用的2个函数是在库函数修改来的。
3 k$ J. }; B9 S% a( A一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的
1 k3 D& @# H& E5 ^0 O6 c3 p3 F# B0 T- u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)
2 F) d5 K1 U$ y7 u8 e8 K/ a, t - {
' N0 P, f/ G: m3 n4 [' Y Z0 D1 o9 o - FRESULT res;
& a% x' n/ i" ^' g/ I- { - u8 ack=0;
$ Z" o4 G- u" L# r$ ~) x - char * location;
: ?( k/ r B7 A* W7 Q: H5 k - char * target=0;
- p Q3 @4 m7 C, x1 J - char *fn; /* This function is assuming non-Unicode cfg. */
7 B7 w) u, F F, r
& a# ?: H& [6 l3 x; |- fileinfo.lfsize = _MAX_LFN * 2 + 1;
: t" K( M2 i9 ^0 J( o8 }* r: e, [ - fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize); N7 Z6 w3 D4 E A6 f/ w
- 1 ]4 z! J$ l1 U. J
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录& Y) F/ x+ C7 p J- h7 Z
- if (res == FR_OK) 5 K2 K! g. o% U6 J4 c( a N O+ r# S6 m
- { & v& t4 B) s! @) b, G/ d
- printf("\r\n");
: j: C5 O- w# ~& o - while(1)$ c Y# ~8 L0 F* o3 E8 C
- {: @, d( B7 t3 G6 L( b
- res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件& k/ K# b4 C3 w
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
{7 R: e$ u# I - fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
! W# A- ?+ Q/ ^# P# f - : N1 ?; U) z4 C' o+ t/ l6 W5 \
- printf("%s/", path);//打印路径 : F \& g7 G$ g& \0 [! V
- printf("%s\r\n", fn);//打印文件名
4 W9 e1 L2 N/ Y- ^) _' H - location= strstr(fn,name);) I; A. n# \6 g0 l0 A4 z( V- _
- if(location&&location>target)2 y# V' i8 A" u; [6 T
- {% X0 x, z0 _% @; O O4 e: W
- ack=1;0 ^' q8 U y4 ~8 o: P
- target=location;8 \, ?2 M+ g# @+ \
- strcpy(Targetname,fn);3 I% S* w1 s+ i0 @# @- L
- printf("update!!!\n");
8 V6 |0 A$ V1 v, b0 ? - }
& L" i: Z: j$ c! Q5 Q - } , h1 u' B& w8 ~
- }
" g" {( d& B* k" E' o n3 ~ - myfree(SRAMIN,fileinfo.lfname);' u9 N1 L) r U$ T
- return ack;
8 b3 N; a0 M) w2 t0 Y- v4 q - }
2 Z8 _. u- M- r: \
/ Z, P- k- M) C9 r5 S+ k* M2 |! x- u8 Check_Dir_Exist(u8 *path,char *name ) 5 U- e$ h0 c2 |% U
- {* D H2 O. e& `: T# Z
- FRESULT res; 4 Q8 G) }5 w e
- u8 ack=0; - v# l1 S# } G" P: N
- char *fn; /* This function is assuming non-Unicode cfg. */
' E% g2 R, B6 P
1 ?; W& l# l* o$ ?" \0 j- fileinfo.lfsize = _MAX_LFN * 2 + 1;
3 F' x. s/ z0 x- S - fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
. i6 |9 P3 ?) e. \* `0 k5 Q - & I- W& J$ `* E) u) U
3 i4 D' E+ F" _& x! c- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
2 M* c# W) W T3 U8 x7 w# b1 _ - if (res == FR_OK)
" _, l5 s' S4 _+ Q - {
# ~. r% W* q0 L. r2 c - printf("\r\n");
$ K% W* i% g& S - while(1)
' g+ O6 w' X& W/ f - {+ B3 a' F" z. t, j$ d
- res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件$ [8 r0 b5 f) E3 p$ |" `# _8 E8 I
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出# Q' S/ c" U m# m2 Q% m3 G ?
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;" J. j; T) `( D0 [& _) c' q3 ?" n7 u; J; \
' P0 g2 O" D/ a8 v/ T3 l; w- printf("%s/", path);//打印路径
0 n1 R9 G$ a7 o- C - printf("%s\r\n", fn);//打印文件名
" j. ~/ u A+ g8 t7 B$ z - if(memcmp(fn,name,strlen(name))==0)
$ V8 B/ B$ h- K$ u" _& N - {/ z R5 q3 r4 ^$ W0 q) H4 e, G
- ack=1;: F B: N+ M" K9 z% y6 y
- printf("Dir_Exist!!!\n");3 D0 X% R9 L; b; G3 ?
- break;- `3 P4 j1 o( G3 }# o
- }& y" v3 `+ M6 M/ z; V5 u7 i
- } 9 A0 i& c$ Z, }& ^
- }
, p# N; f9 w+ p; g, ?' r: z - myfree(SRAMIN,fileinfo.lfname);, g8 M0 J0 k' I2 v5 u( p
- return ack;
# K, N7 T: T8 B$ N2 A; C \4 d- Z - }& |, u* a% y* ]8 R X; A" A+ o
复制代码 希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段6 B4 o/ V4 n9 O
|