做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。5 V. d C5 C9 U; u) @* V
保存在SD卡即可。
% B: Q1 n( H3 t/ q问题是:这个文件叫什么名字?5 _& E* @5 W U! w2 y7 H! {! s
以前板子又RTC可以用时间来命名,不会冲突。
0 w9 F; X& O2 u# Y3 W, d) Q/ O( F现在是离线的设备 怎么办?
' D1 K* d+ U6 w3 }想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt New_Report.txt New_New_Report.txt..这样效果5 A' t V+ H v. |' x5 @
5 d$ Q' W& l/ ] B思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。$ Y3 ]0 q7 f D' `
, ~5 Q1 w# s3 ^0 X0 ]
代码:
% s( [5 l' n% b- FRESULT fr;; x+ c# C3 H' g0 ]6 f
- TCHAR str[10];7 n" N8 v* f7 j0 i
5 g e- t$ u/ F1 p% Y- char name[50]={0};
/ w, L3 x! O5 I c, s - char newname[50]={0};
7 B; v8 O$ i) a3 w: Q - void Name_Logic(void)//char *name)# k! L; L4 ~2 P7 ] V
- {
7 f2 X6 Y- Y7 [$ z - u8 rval=0;
+ i" z8 [( X4 D9 C+ O - DIR SDdir; . E+ |& S$ {6 j6 l
- FILINFO SDinfo;
0 F( g: u+ h' r/ h - ' o0 k/ |( x; T; |
- if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹( X0 N0 x) \& \/ T7 I5 {
- {0 u! b, `8 G4 `$ b/ N( P$ b5 B
- //已经存在 啥也不做& k/ I8 t" S; [3 m$ W' |
- printf("HAVE DIR");
# r) g, e s5 m5 ^- W9 g- U$ p - }/ n( a; g# w: r5 Q
- else. F1 J2 k+ D1 N: a& ~& k
- {//不存在 创建文件夹
9 [5 j6 |5 `# O; {2 [9 w* f - mf_mkdir("TMReport1");8 i7 [/ `7 {, g; t* W" D* x
- printf("HAVE NO DIR");
7 ?) D- ]- z2 A7 y1 f" } - }# k* I q: @/ ?; Y# v# v) Q% |# M
- //准备切换文件夹# X' t& C( r. V8 r- m
- fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的, C! z8 m8 N0 n8 w0 c0 q' Z
- f_chdir("0:/TMReport1");
! z1 l6 J4 }$ R i - fr = f_getcwd(str, 10);//此时已经切换
8 M# }8 x$ i/ W6 c( d$ m6 L6 I- K -
$ n. f' V1 j6 _5 N H5 [* }0 G2 f - //目录下找是否有文件" u% h1 g. u2 ?2 \4 e/ l8 P9 K
- rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
8 s" i- i) [1 F - if(rval)
$ u7 v5 g% z7 q! E! D4 f - {: N: p+ x2 c @# B3 Y% U2 F
- Finish+=1;8 M: B1 Z8 q7 N, q5 x P
- printf("HAVE TXT");. f6 Y" M6 `1 W0 k# g; R" R& H, k8 M
- sprintf(newname,"%s_%s","New",name) ;% l0 j0 n v8 M' Y: r0 A
- }
; e, U$ b* x* X - else
2 b! u: m/ b3 ]; n& E' [ - {
4 q3 Q4 n0 @. n+ z - Finish+=10;( w# P; ^8 c7 X6 V7 C
- printf("HAVE NO TXT");1 @& U O# }$ ~7 H+ ?# G
- strcpy(newname,"Report.txt");, z$ o( Y( j- d" [
- }) {6 O: H) e0 Z# a6 _# v G
- f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了+ D, N8 H' O9 o
- f_close(&fil);
- s' p1 I% |. j [6 Z& n1 c" W - }& j9 @% ?0 E, R1 r9 x
复制代码 7 z( _1 B4 k2 v6 m" m5 m
0 Q4 Q" {0 c+ ^ b看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
0 r- Z/ B, X: F' ~5 y0 ^主要调用的2个函数是在库函数修改来的。5 q. [( n( _; s; e) ]( X5 u
一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的 l% z; G" S* z' Q: e' u
- u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname) & ~3 d0 Z! {% E
- {- j3 ^0 I* x$ \9 p
- FRESULT res; 8 y% E0 W7 W1 h1 |2 p9 b2 |
- u8 ack=0;
& |0 V+ V" c% B) t }' y& ? - char * location;
. d f% g1 u* @3 i5 V. [5 m, y! ` - char * target=0;
# H( \3 o( F. P4 r/ ` - char *fn; /* This function is assuming non-Unicode cfg. */
^2 L1 j( c- a6 T/ i
* O+ {7 N: [0 D9 ~7 K2 ~- }3 ^- fileinfo.lfsize = _MAX_LFN * 2 + 1;& ?1 r- @% h7 D( y% m
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);* F! S% t) e0 I0 T
- + b7 M- q, G7 G L0 L
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录8 z `& T& l7 A/ C
- if (res == FR_OK) 9 m: c7 H# D4 T; I6 o
- { $ I4 f( S' B7 y( l4 z
- printf("\r\n");
4 p: l! T3 |$ k4 s9 }& e2 N - while(1)
% V: L# O/ h6 b7 ~$ d8 h - {
" {. l! ?6 m! n - res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件; Q9 J: h$ X, _ Q; W
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
: i5 d1 {* ^: i# x3 c, f+ F+ { - fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;/ l% T0 `* h, M% ^1 }. a
$ G" Q3 X, K* Q' N' {: U0 f# G2 M- printf("%s/", path);//打印路径 8 ?8 N' p2 e- B6 i" {# E
- printf("%s\r\n", fn);//打印文件名
6 g; Z$ A6 p9 B% R - location= strstr(fn,name);
1 _ x; v4 ?% Y: {/ N$ d' g. i - if(location&&location>target)& r. [% l- h) V+ a, O. `; Q" l B
- {, C( q, x" ]9 q' z! I- J* F8 ]9 k7 j: g
- ack=1;9 Q, @7 T. g' P/ i( J4 n
- target=location;5 m) U# L+ P( O4 C6 }& x6 D4 U
- strcpy(Targetname,fn);
; p$ N! N# N3 B, H - printf("update!!!\n");
& [5 z; O! U) o. x. r - }
! y6 ?9 v/ i! w - } ( E" u3 d: i2 y# @' C+ ~
- } x& n1 `- Z7 B1 M! j% M7 C+ C
- myfree(SRAMIN,fileinfo.lfname);
+ d5 S1 T' }. O! @% I" F, i - return ack; 3 R, t9 r* N. }0 V
- }
4 @. h* I- }: W, [ - 0 f" S: ~. p j0 `, F
- u8 Check_Dir_Exist(u8 *path,char *name ) 1 S N) s. a, N! b, p
- {
[! b" l+ }/ o4 u0 k - FRESULT res; ( g3 s1 q' ]1 {1 f
- u8 ack=0;
' c$ L7 u! n* |; k - char *fn; /* This function is assuming non-Unicode cfg. */
1 s5 {4 x& O. B1 W' q
6 ^; Y5 \, L! F% ]% y8 s0 c- fileinfo.lfsize = _MAX_LFN * 2 + 1;6 e" V5 y) @/ u' M
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
3 L* |' c2 D! I4 l( D# [+ G" O - 7 X F: L4 x- U; M) F! ?' Q
- 0 w. c6 E7 C) t) }8 x, V
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
' a, E6 r* j) Q: {1 P3 F - if (res == FR_OK)
* c# ]) r* l# F7 M/ Z5 j - { 5 q! F, E; @5 |; n) _( G. p6 u/ G
- printf("\r\n"); 5 w: t1 }1 ~) N6 s6 Z* u
- while(1)
& K" u* c/ q6 U% B. | - { D- F: V( ~ J3 W7 [
- res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件; d/ `1 W) N" `4 o7 n
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
3 T2 E: X- c9 l1 Z5 l& R$ G/ ^ - fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;( U6 y, w9 P: l
- , P& ^8 e/ T5 F! n4 r. r7 B/ j1 i
- printf("%s/", path);//打印路径 1 y! x& D, {3 F9 k& W
- printf("%s\r\n", fn);//打印文件名
+ N: i* H, y5 ~5 Q5 h9 { - if(memcmp(fn,name,strlen(name))==0)3 `6 L3 g! Y9 ^' Y
- {
2 k! P. D) W6 [- c Z" G# T - ack=1;" r1 s3 e/ u* h7 l
- printf("Dir_Exist!!!\n");
0 _; U) A( U% k - break;
B: J1 {$ ?' ]; a5 s7 V8 D* b - }( {- R- ^7 S. R6 y) G z
- }
! f. t" Y! `/ V% n& n1 d2 |0 R - } 1 S7 L2 A7 V, ^% O
- myfree(SRAMIN,fileinfo.lfname);9 w9 u% S1 |% e1 g: w9 ]
- return ack;
9 {1 e; y \% O. e4 x: } - }2 ~# K) W* V9 ^) O4 Z* @# D
复制代码 希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
8 A4 ]8 Q1 Z% d" i0 M7 M+ X |