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

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

[复制链接]
GKoSon 发布时间:2018-6-8 17:52
做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。
" t' V: B) o4 E) m! Y' K. W保存在SD卡即可。7 B! o. k- r+ N; s8 N' m% [5 J
问题是:这个文件叫什么名字?" G% g$ W$ `* X0 r; F1 s
以前板子又RTC可以用时间来命名,不会冲突。
( ^/ e9 n, B# `5 w现在是离线的设备 怎么办?* i- b7 @0 h, C! |8 N0 ]
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt  New_Report.txt New_New_Report.txt..这样效果
" W: @+ J! N7 |6 Y4 ` 2222.png " w2 Z0 A7 Q& o9 E  Q
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
) m8 Y3 B" A) q5 O 333.png . u1 Q4 ~4 }0 R0 C) Z
代码:
" b/ [( G2 t4 o9 U- @( S1 Z4 [
  1.    FRESULT fr;
    6 H% ]6 T; R& ]8 i
  2.     TCHAR str[10];: e* S: R0 J: }% L8 U& z
  3. # T" k) ]! |: [# M' I- x
  4.         char name[50]={0};
    2 G% N: b, Z4 `6 w
  5.         char newname[50]={0};3 W' K  {9 c- q  {' |
  6. void Name_Logic(void)//char *name); z. F+ Y) ^) y7 P
  7. {
    ' C# w$ L" j2 ~- U+ O
  8.         u8 rval=0;) |; D- b; T' H3 O. o7 v5 N- G
  9.         DIR SDdir;        5 ?3 J, U4 {) s
  10.         FILINFO SDinfo;
    4 O+ `+ W+ \0 ]- F. X$ O; {
  11. 3 y) F# v5 ~; |% R; y0 k6 ^
  12.         if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹& \! j1 E6 {# a$ q/ K2 L
  13.         {" ]( V9 m) y8 s4 f% [
  14.         //已经存在 啥也不做2 Q) t5 {8 X0 o# c/ b& [& s' D' n
  15.                 printf("HAVE DIR");
    . b5 b. u6 R+ Q( h6 \- \: g
  16.         }! a* G) l1 b% j% P' D
  17.         else
      L( P/ t, G9 n. @1 @6 \; q
  18.         {//不存在 创建文件夹
    ( q& {+ {7 e3 S3 N
  19.                 mf_mkdir("TMReport1");6 W4 R% ^" G+ b  n% e
  20.           printf("HAVE NO DIR");               
    / C2 L7 ?; A& I
  21.         }
    / e( g2 U" g0 r1 c0 d
  22.         //准备切换文件夹
    4 l4 H+ Q' Q1 i7 m$ K5 z
  23.         fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
    5 W5 F2 A7 E. D. x
  24.         f_chdir("0:/TMReport1");
    5 C5 e6 V. O* G" K5 t
  25.         fr = f_getcwd(str, 10);//此时已经切换
    0 O# i; K: t/ J0 a4 f7 G* r4 q# a
  26.         5 T, v1 Q- v' n+ a0 y* T
  27.         //目录下找是否有文件
    * T4 }+ X/ _# V) I' n
  28.         rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);2 }8 T% o. O' i2 S# }7 ~3 h8 q
  29.         if(rval); l& F  S3 s' k
  30.         {* N$ w6 U# ?. L! G
  31.                 Finish+=1;
    ) C- K6 q3 h* h) @# S3 e2 ^( z
  32.                 printf("HAVE TXT");
    1 w1 z6 J( L8 ~) _( r! p
  33.           sprintf(newname,"%s_%s","New",name) ;! `- [9 Y2 h8 [# x7 ^
  34.         }9 }1 M: Z( [6 z. m- K
  35.         else
    % \* M: ~% V$ B- ], _
  36.         {
    1 ]) c! c: K$ F/ P
  37.                 Finish+=10;
    1 v' x8 c. q5 _  \6 U! ?$ }
  38.                 printf("HAVE NO TXT");2 p, Z5 D; m4 H( C2 A* H9 U
  39.                 strcpy(newname,"Report.txt");% R- E' M! y  u
  40.         }% y+ _' I$ z" P0 O- M: L) p
  41.                 f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了' d# S- J9 ?* J& ~  V
  42.                 f_close(&fil);
    3 L. p2 E/ y! p% y6 n: Y6 B/ }2 E
  43. }
    4 u  `7 T- D0 \" P" w! }! ^6 v" U
复制代码
9 v8 ~5 Z3 W" n
0 B( F0 H' W, d& c- b# j4 j
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
: f/ X0 k+ c+ z& t: I' f& b主要调用的2个函数是在库函数修改来的。
) M+ L' }9 M+ I: n, b一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的9 @/ p, n/ h2 ]7 b+ D  P& z
  1. u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)  7 a% P. D/ r7 E
  2. {! G% Y  E. D# ]
  3.         FRESULT res;       
      @2 E( q4 `7 L7 l5 c7 h+ p
  4.         u8 ack=0;5 j0 X' J( F4 o" _' P
  5.   char * location; - F& e$ }# J: Y
  6.   char *  target=0;         ) ~8 G  i- J4 q. X
  7.   char *fn;   /* This function is assuming non-Unicode cfg. */, [+ T7 Q8 M2 V# |0 h$ r0 e
  8. & l& Y# y& x: |" j8 V7 U$ [7 h! u
  9.         fileinfo.lfsize = _MAX_LFN * 2 + 1;# z; M# K" K' t. F  N1 D
  10.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);8 k0 @6 X; M) s
  11.                     }' K6 f3 O: q! c4 c) V4 k
  12.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录# b* ^) s) a" g$ s
  13.   if (res == FR_OK)
    . B. q$ E; v+ {% h
  14.         {        3 @2 c* a/ C/ V; j4 A  V- ^3 \
  15.                 printf("\r\n"); ! k7 V6 Z5 u7 P! i3 H9 J+ p
  16.                 while(1)
    # E; c) a4 @# w' B4 S
  17.                 {
    ' o: e- j4 Z$ Y) s+ R
  18.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件5 Z. |' ?! [1 R2 ?4 ~0 o5 R! o# D/ P
  19.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出. l' C. b9 W4 b$ W+ \- \1 q
  20.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;! `8 ]( @+ h5 V

  21. ) B" X: f6 G( c4 o& l% B& C
  22.                             printf("%s/", path);//打印路径       
    : s. x$ H6 f; O- C" {
  23.                             printf("%s\r\n",  fn);//打印文件名         
    $ P' @1 v# {4 T! F1 M5 L
  24.                             location= strstr(fn,name);5 A2 c* p; r9 ]5 F7 y& q2 I
  25.                                         if(location&&location>target)
    & E4 a! S: D% j4 X7 h
  26.                                         {
    9 \$ i- R: V* q3 D! q
  27.                                                 ack=1;
    - X, D5 D$ {% y
  28.                                                 target=location;9 J' e% S# `$ z  M. S& ]
  29.                                                 strcpy(Targetname,fn);
    ) T$ o0 Y) G( k
  30.                                                 printf("update!!!\n");
    & d+ J6 u6 d3 E* }- ^$ A5 X
  31.                                         }
    : j, [8 w( w# V1 i
  32.                 } 4 S/ E% k- a) B: h
  33.    }          
    7 j: M1 k6 f; e, I. C" }: j
  34.                 myfree(SRAMIN,fileinfo.lfname);6 K# ^) G5 n& {) D& _3 u
  35.     return ack;          0 x" r9 a/ Q1 g! Q$ B
  36. }
    6 n( q( ~4 h( ~' X$ W# y0 z- ~

  37. 8 P' \9 m7 j$ b0 T
  38. u8 Check_Dir_Exist(u8 *path,char *name )  " N& {6 r7 M( q* F; r6 A3 g+ D
  39. {+ o+ J9 b5 `: w% U/ x2 D
  40.         FRESULT res;       
    ( m" R5 S1 H) \- V" Q8 K
  41.         u8 ack=0;          - M5 n" f5 H3 Y7 r! v
  42.   char *fn;   /* This function is assuming non-Unicode cfg. */9 I$ Z+ q3 D( P, C

  43. 5 u, P2 }. [/ j: b# T
  44.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
    " [: c9 B/ o: a- c. m! O, `
  45.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
    * b9 a' D7 ^$ Z% |
  46.                   
    7 I  B5 }! [/ q( o

  47. 4 Z+ X) [2 c8 v# e9 Z. G/ S6 J+ h
  48.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录- i. V+ _, w9 i7 R6 O% g
  49.   if (res == FR_OK) + Y/ t9 y: C$ c( ?& [- K% t
  50.         {        ) X. v' T. |1 A1 P% Z: e
  51.                 printf("\r\n");
    9 s8 ~' H! K3 f' O# Y
  52.                 while(1)$ P* U( Y+ U( c1 E$ R& u9 D$ |
  53.                 {
    - f; k, l5 P% K  r
  54.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件/ T( @+ }- @+ R2 G8 F
  55.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出, T0 _5 |* N  {) R! K! Z5 M
  56.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;$ w) p) W$ h+ e. B$ b) x

  57. 3 I+ ?5 v( t  ]1 i! ^
  58.                             printf("%s/", path);//打印路径          z+ i8 h, V- f9 ?$ ]1 c2 @4 j( ]
  59.                             printf("%s\r\n",  fn);//打印文件名         1 D2 h. j0 C2 @& w4 Z8 Z' O- e
  60.                                         if(memcmp(fn,name,strlen(name))==0)
    - @. p. X/ W7 {6 r# N
  61.                                         {
    ! H  n8 r) k# W; |) M/ n
  62.                                                 ack=1;
    6 M3 N1 W, ?0 N
  63.                                                 printf("Dir_Exist!!!\n");
    9 c9 M5 \' g3 H! q. P6 z$ b
  64.                                                 break;
    ! |! s1 N& j" b, o* j, r# |
  65.                                         }, h5 K" W3 M5 ?) O2 E; C8 }5 c
  66.                 }
    7 ~, `2 l0 U6 j1 @
  67.    }          
    2 w* C- D# x5 D% ]
  68.                 myfree(SRAMIN,fileinfo.lfname);  c! a. Y+ o  {3 A/ h/ s4 K2 o
  69.     return ack;          
      h2 L, t" w/ g. B! H4 p; U
  70. }3 r5 i- i3 W" `( Q5 l$ _8 l7 c
复制代码
希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段' m! j; ]8 z2 I
收藏 评论0 发布时间:2018-6-8 17:52

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版