你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32文件系统一种存储文件的命名方案

[复制链接]
GKoSon 发布时间:2018-6-8 17:52
做项目,需求有一个需要保存测试报告。前面已经做了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
2222.png
$ G7 Q5 f, O+ m7 l思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
+ v" N6 P: ~! S, j 333.png 5 e( J% B+ o& s. ]4 T: m
代码:8 j2 v$ B# k- G, G! K  m, [4 h
  1.    FRESULT fr;
    7 Z; d  a1 l+ H! z. J
  2.     TCHAR str[10];- g' ?( ^6 Z3 w3 E& L% ?# Y

  3. ; Z  Z& e) d: t+ J) C, }
  4.         char name[50]={0};; `2 }" r$ |7 q
  5.         char newname[50]={0};- S/ H0 j' I: d2 h% ^, j
  6. void Name_Logic(void)//char *name)
    / C/ D% T" S4 Z6 |; l7 j
  7. {( g$ @$ {, J" T8 u7 b0 u+ ]4 T
  8.         u8 rval=0;
    " X3 a& g( T9 T0 _; @) x# G
  9.         DIR SDdir;       
    % l' U: y5 T: a, X: Y( ]# F4 k# R9 B
  10.         FILINFO SDinfo;
    1 p- @' N$ f! F8 D: U
  11. : S" t1 w. [: ~# o9 g
  12.         if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹. g7 x4 _  N1 b# |5 g
  13.         {
    " y; v& I, W$ H$ E: P  y3 I( B
  14.         //已经存在 啥也不做( ?: h* u* k; d+ W1 O
  15.                 printf("HAVE DIR");3 U+ L4 r+ x* S5 `% h
  16.         }
    6 H% M! U( R! k) E
  17.         else8 w; [' P4 o  O5 l! @( S: l
  18.         {//不存在 创建文件夹. B% e6 @+ s, ~! {3 B) }/ L
  19.                 mf_mkdir("TMReport1");
    ) L8 v9 B6 D0 q  E+ C
  20.           printf("HAVE NO DIR");                9 k! X5 b5 l, Z6 z& i* ]
  21.         }( {5 B/ q5 k$ C& ]- M7 g4 i
  22.         //准备切换文件夹
    6 c1 w' C/ m! G# ~
  23.         fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
    ( w( M1 s( _# C- W: N  m
  24.         f_chdir("0:/TMReport1");' x; v+ o# k4 H% Z5 H
  25.         fr = f_getcwd(str, 10);//此时已经切换
    % t0 u2 V- P) C2 g" \! K, D/ Z% [
  26.        
    2 p* I. O5 I* j6 s
  27.         //目录下找是否有文件  W3 E/ c$ t2 g# l5 I2 \- y' i8 C
  28.         rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);6 E% L# T/ B: Y* m
  29.         if(rval)
    + x) u7 n% |& Q) g9 G
  30.         {6 a4 H) S8 ^2 Q; @: F$ C$ @4 F
  31.                 Finish+=1;
    # j, i, c. j' \: ]6 E
  32.                 printf("HAVE TXT");
    1 U: l; z+ s% n5 e, Y- `, D5 H
  33.           sprintf(newname,"%s_%s","New",name) ;0 b) D/ h) p7 l" }; y; S
  34.         }. B0 A4 j% {; o2 }; f2 W
  35.         else" ]" O$ p0 E5 ?5 K
  36.         {
    # K  p- n( {, ]
  37.                 Finish+=10;/ R! X1 V- s% |3 `! N# x
  38.                 printf("HAVE NO TXT");- X  N: D- d% T0 v. m& z
  39.                 strcpy(newname,"Report.txt");
    % A; m0 v4 [" V$ B* B3 s4 }+ Q! E
  40.         }
    4 `+ x. s' b- m& w0 H
  41.                 f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了8 o" ^9 Z. c. b  M; t  _: l6 {& q
  42.                 f_close(&fil);
    ' J0 U' H& {) c; p
  43. }
    $ 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
  1. u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)  8 c" ]* G6 V/ ^$ p9 t6 N$ i
  2. {
    $ R) h; f& l8 O! j
  3.         FRESULT res;       
    2 @8 V  e0 m' g  g( Q
  4.         u8 ack=0;' ?" u- v( v% W" d' g
  5.   char * location; 7 I! e; _' V2 U  h% C/ c$ n
  6.   char *  target=0;         ! u" q: V& d( Z9 P: y# U1 v
  7.   char *fn;   /* This function is assuming non-Unicode cfg. */( @2 I: g4 O7 C3 d5 P, ?
  8. ) d" S% O) @* f2 W% e( H
  9.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
    4 k1 Z8 m* r" F- D5 `- W
  10.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);2 J2 ~" A$ [/ I1 B* [- m) f- g
  11.                   
      l7 W+ V+ B8 {- n* V. P
  12.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
    + }3 P6 d( }* p8 m- X6 G
  13.   if (res == FR_OK) % R  Q3 \- _( z- ^; f5 h! y5 O
  14.         {        3 q  l; n7 b* U
  15.                 printf("\r\n"); - y5 h. k8 \" U! f- A3 ^5 U
  16.                 while(1)
    / x7 f$ E- e7 C: \, f; i
  17.                 {
    1 o4 G& }- G7 Z' _' Q
  18.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件7 v. k# ?0 ~4 d. f, f3 E% ^4 Z
  19.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
    ' E5 S; f! B1 v% @
  20.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;$ D7 l2 }2 s  Z
  21. ) ?1 V& d# L; e1 {+ B; Z
  22.                             printf("%s/", path);//打印路径        9 N/ Z$ s/ Z2 `
  23.                             printf("%s\r\n",  fn);//打印文件名         
    ; {5 S. c. E2 t8 _/ @! t; G$ H
  24.                             location= strstr(fn,name);
    ( [# }- {5 |) x; U* ]5 Q! R
  25.                                         if(location&&location>target)
    0 m# j2 F1 n9 n% h6 X
  26.                                         {
    5 ?, Q3 T5 c( k$ ~* h; v) z" O
  27.                                                 ack=1;0 m- \6 s) G' Y! X* |. A2 W- A* V
  28.                                                 target=location;+ |' X) w! ?$ E, P; g& @
  29.                                                 strcpy(Targetname,fn);
    , @; T# t  _* A% ?* c
  30.                                                 printf("update!!!\n");1 O+ ~8 I4 ~7 i$ y( Y
  31.                                         }
    4 D7 _2 [0 `. U9 j0 e! G8 O
  32.                 }
    ! C  I, Y; F# ^6 f! y0 [: x
  33.    }          ( e0 g3 H1 p$ c7 _* x
  34.                 myfree(SRAMIN,fileinfo.lfname);" G& F( D1 ]3 c6 J7 |. W/ f
  35.     return ack;          - ]; R2 i; o8 \
  36. }5 f% b* h3 i3 V+ a9 k
  37. % z3 Y! j" P* i, G
  38. u8 Check_Dir_Exist(u8 *path,char *name )  ( |" n4 x5 a, H! O: f. |
  39. {1 E' J( l% ~) j+ S) R
  40.         FRESULT res;        5 |' Z6 M# m. j9 \
  41.         u8 ack=0;          
    & c2 P" d; B) o! x; X
  42.   char *fn;   /* This function is assuming non-Unicode cfg. */5 y& Q- J, e) c# M
  43. $ t* F( M. n1 D" M. C
  44.         fileinfo.lfsize = _MAX_LFN * 2 + 1;4 p, v# b8 B! H! G6 X
  45.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
    2 h* [3 F& X/ j+ b+ h# C3 l
  46.                   
    ) A) i1 s1 P$ v# R- H9 I' ^% x
  47. ) t: G$ A( q1 e% F6 i+ t# c0 }2 n) B  J
  48.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
    ' {" j; Y& J7 L1 n
  49.   if (res == FR_OK)
    7 t# b5 M- Y1 e8 ~9 s, b: ~6 e
  50.         {        ( ~! y5 I- ^8 B% R* O$ B# w3 H
  51.                 printf("\r\n"); " Y; M; L; ], Q1 _6 h  t6 P! a% ~
  52.                 while(1)6 ?/ n% M7 f; T1 {0 R( q! B6 r) V
  53.                 {2 u& ^3 D; D* A7 e- M
  54.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件
    - j4 }$ u8 C( r0 F
  55.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出! g/ {+ G2 Y* X8 e
  56.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;! V9 d5 B* H, p0 Q) `

  57. # x* Y- L, w# F/ v$ ~" c# z
  58.                             printf("%s/", path);//打印路径       
    ! D1 f, }( H/ S4 A1 ^
  59.                             printf("%s\r\n",  fn);//打印文件名         
    ) u& y* y# m2 G# W  e! K  Q
  60.                                         if(memcmp(fn,name,strlen(name))==0)
    4 N- D; W0 q4 F+ e  X
  61.                                         {, t- l0 O8 T; b1 H7 t
  62.                                                 ack=1;8 p( G8 t* c5 k/ u, N) ?& X
  63.                                                 printf("Dir_Exist!!!\n");
    ' h/ [- A+ m9 `' V2 ?+ C( Y
  64.                                                 break;, [! R1 z4 C5 m8 _
  65.                                         }
    % B' M1 S  w/ O: W9 l$ K0 q) ^
  66.                 }
    ; y" w* ~/ e, C, o/ i5 ~( W- @
  67.    }          
    3 Z& L; m& d! L; h2 T* m4 r
  68.                 myfree(SRAMIN,fileinfo.lfname);
    - j! G) c" x0 U7 p2 H4 ]/ V% Z' L; y
  69.     return ack;          
    : z$ C( u' X  A
  70. }  k! B8 \# c3 A! G
复制代码
希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段& \6 q6 c/ b$ m  t! d
赞 收藏 评论0 发布时间:2018-6-8 17:52

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版