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

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

[复制链接]
GKoSon 发布时间:2018-6-8 17:52
做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。
* W& M# n: o1 M! P保存在SD卡即可。! v/ ^# }3 m8 l% L9 ^
问题是:这个文件叫什么名字?/ w/ ~7 t( u' L
以前板子又RTC可以用时间来命名,不会冲突。
: G1 Q7 [  b! I现在是离线的设备 怎么办?! k' X4 `# B  l9 [; u
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt  New_Report.txt New_New_Report.txt..这样效果, v  i6 V- ~& `% f# m
2222.png : @( Z( ]* a/ v/ s$ E: P# ]
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。& S" ?7 Z9 _2 i# J) g0 J. H
333.png
! S2 V. W$ z! r7 _; _代码:
& u8 p: p0 _2 G8 B; x1 A
  1.    FRESULT fr;4 d" W6 M. _- \9 r; K
  2.     TCHAR str[10];- J7 ?! K) h" k/ i; t( a5 w# j

  3. 7 N; x; h% u* S7 f% @/ ~
  4.         char name[50]={0};
    + o- F# h9 V( n! p$ w
  5.         char newname[50]={0};; F+ D1 h# [# _' f8 L) b( A: H# w
  6. void Name_Logic(void)//char *name)7 h4 S9 `8 l7 e1 C
  7. {/ [4 q1 J; ^2 G: Z, `7 j0 G- X' G" M
  8.         u8 rval=0;  p( i. h( H3 c" O" Z( B% e
  9.         DIR SDdir;       
    / C4 r6 V# \; k# g. M) y- \# Q/ l" c& P  W
  10.         FILINFO SDinfo;
    , P) b8 e5 }- H3 e: v7 T/ q$ ]

  11. ' F: t3 @0 d, D4 \# ?
  12.         if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹
    , X4 [* |2 f7 a+ w) @6 Y6 q- P
  13.         {( ~/ X! d7 ^" M- N5 l: U. U. [
  14.         //已经存在 啥也不做
    8 X. h/ `! ~: C5 A! t: a
  15.                 printf("HAVE DIR");1 a+ V! Z  u9 o! z% o4 ?8 Y0 u
  16.         }
    + R) c/ z! {8 ~% C4 U2 r
  17.         else5 S* h- t9 i4 `3 g
  18.         {//不存在 创建文件夹
    1 g* o, S. ?* t. L3 i: r* F
  19.                 mf_mkdir("TMReport1");
    + W! v% `* y9 {- s) I) O* _( i
  20.           printf("HAVE NO DIR");               
      U- \* R% t2 f/ q; I, C' g2 Q
  21.         }
    - Y6 y/ w  t! W4 b
  22.         //准备切换文件夹
    , N5 x/ s9 Y& p, j3 \7 {7 U0 |
  23.         fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的) B5 I, D* N' ]4 P: z7 q+ W, m2 ^' n
  24.         f_chdir("0:/TMReport1");" a5 y5 |, v3 ~* M' W
  25.         fr = f_getcwd(str, 10);//此时已经切换) C3 i" X+ v6 M; q, t7 O/ l
  26.         2 w8 o* x/ }, s8 |
  27.         //目录下找是否有文件
    + Z9 t7 U1 U! Z
  28.         rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
    8 _7 r# `8 K: ^
  29.         if(rval)
      C& l! v- ]8 W. c4 h3 E$ h- ]! r
  30.         {
    + n  \' f: @' w: w2 k* a7 t
  31.                 Finish+=1;+ D& W  z5 L* s
  32.                 printf("HAVE TXT");
    8 L1 [- i. V7 o' c# q" B
  33.           sprintf(newname,"%s_%s","New",name) ;
    # I% N) Q* Z2 @+ B. C4 f# z9 M
  34.         }- o( m! ?) K, u5 q( N9 @/ ^% K2 t9 d
  35.         else" w# D1 E4 f1 T! y0 z  ]
  36.         {7 K( Y7 m5 G: I) F* Y+ l- i
  37.                 Finish+=10;
    & V0 \* H" K/ B8 V7 y" k
  38.                 printf("HAVE NO TXT");# Y$ @5 q$ W2 K9 ^
  39.                 strcpy(newname,"Report.txt");6 O& L2 R* w) k: C8 ]: ]
  40.         }9 C! T0 z8 }2 D6 C
  41.                 f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了5 V( `$ ~9 g5 t
  42.                 f_close(&fil);
    5 D( ^$ b; B2 a7 o: ], L
  43. }) O/ C$ M0 V0 q7 l* o8 a% z% A
复制代码

8 S. B# ~/ O1 M# U3 L. Q& D# C+ ]. V; _1 O; j: M
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的 + \: a+ F( H$ r$ J1 A: C% Z- Z% S5 u
主要调用的2个函数是在库函数修改来的。
8 A" m6 O% T% @1 M4 Y. a一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的6 @& h/ y  e  R- ~$ F' m/ ~. C
  1. u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)  6 y+ Y0 B' g7 X; P/ w. j% L
  2. {# Z& x8 _- ~5 s$ }* h
  3.         FRESULT res;        6 ~/ G# u2 j# k6 n( {( D& m
  4.         u8 ack=0;
    % j( ?  I1 v7 X  I
  5.   char * location;
    9 ?# j: K# l* {
  6.   char *  target=0;        
      Y! Z; M* w; u% q8 y% x+ b
  7.   char *fn;   /* This function is assuming non-Unicode cfg. */
    ' c1 L/ C# E$ J

  8. ( d1 J7 @- K3 J# y( B9 M+ h' R& [* i
  9.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
    0 J4 ?$ p9 e  W& B1 N4 q
  10.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);, l( j4 p: K7 V# k
  11.                   
    $ _3 C  P, I1 I( F
  12.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录/ S& {8 |6 N  B  \* r7 G& h
  13.   if (res == FR_OK) . l1 d" W6 c0 e. A
  14.         {        ( l" s2 f; W/ @8 Y. w
  15.                 printf("\r\n");
    " K( T9 b6 `$ Z& q
  16.                 while(1)
    8 F% k9 v$ P( s4 e
  17.                 {
    3 n6 X% b% s( n6 J$ p
  18.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件
    ) y5 ^6 W3 ^, ~+ N/ C
  19.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出* H8 z% D9 ~9 ]
  20.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;- g' R$ B3 |* L

  21. + l- V% O6 W/ B& b$ n6 k0 ?
  22.                             printf("%s/", path);//打印路径       
    + d& l- I, V, C" V- F
  23.                             printf("%s\r\n",  fn);//打印文件名         
    ; K+ p( J4 y0 r9 [
  24.                             location= strstr(fn,name);7 O# @! [9 Y$ n& P3 C) g1 D2 W9 j
  25.                                         if(location&&location>target)
    $ e5 @# W& H) p/ U
  26.                                         {
    6 v$ x( T" h% @/ ], H
  27.                                                 ack=1;* |1 h3 q- k8 Y* v* D$ x
  28.                                                 target=location;: G& }  M5 }' v$ b
  29.                                                 strcpy(Targetname,fn);
    $ N. ]" Y1 n$ K, V
  30.                                                 printf("update!!!\n");7 F/ s& b8 d! C8 z# l7 X
  31.                                         }( w6 |; ]& W. B4 g0 l: h
  32.                 } 6 m5 |- P' S# M+ d
  33.    }          
    % Q5 {# r6 G' R7 ]* M) r1 p. N
  34.                 myfree(SRAMIN,fileinfo.lfname);- `& d$ D  _' u* H4 a: S% p9 r, |
  35.     return ack;          
    ( L6 J- X, n1 S* A7 r5 y- C
  36. }2 {1 F; h+ r, P$ h
  37. 9 \- o. ^* a  q- I" w
  38. u8 Check_Dir_Exist(u8 *path,char *name )  
    * i/ O, j4 f% C9 d
  39. {3 O, O; j% o$ q7 C4 f2 N
  40.         FRESULT res;        5 B" P: a& q3 h. B
  41.         u8 ack=0;          
    ' T4 X1 f: |) ]9 E: p+ M, R
  42.   char *fn;   /* This function is assuming non-Unicode cfg. */
    4 m+ B/ q% e0 q; \! K9 T

  43. # M1 G. j, ^- g$ n) X: _$ j0 V
  44.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
    8 l/ X: {6 t6 _! {0 Y
  45.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
    $ T6 `/ ~& Z$ l
  46.                   
    : {- o& [' }( y1 Q
  47. * E; r0 Z& O7 L/ _" m( J" U& h
  48.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
    # d1 a! {0 K" C2 M% I
  49.   if (res == FR_OK) " n( T1 ]( a. ]$ r2 K, C. @) m' B
  50.         {          O9 M; G5 V6 Z# X% s
  51.                 printf("\r\n"); $ z2 S3 q) k5 R) b" @, j& l
  52.                 while(1)
    , A+ O8 g; G2 m* t% A+ ]  H' |
  53.                 {: N1 t$ x6 A% {1 c3 z7 r% e
  54.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件
    * e6 v% y0 m8 Y  T
  55.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出+ v' @4 z. N' G" b$ M  S
  56.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
    + A# s% D  T# Q( U" b
  57.   q$ s- W) C/ R3 ^- m) Y$ P
  58.                             printf("%s/", path);//打印路径          @6 o! U0 ^5 f9 H" C- C
  59.                             printf("%s\r\n",  fn);//打印文件名         
    3 }4 x' k9 G/ r/ C4 r2 T
  60.                                         if(memcmp(fn,name,strlen(name))==0)
      q( |4 i! y  D* X
  61.                                         {3 h8 `9 y, P9 e* w3 [+ `* Q
  62.                                                 ack=1;
    % P  r2 ?# s2 d
  63.                                                 printf("Dir_Exist!!!\n");
    ! Y' v( h; z$ @5 q
  64.                                                 break;
    " K2 l" y* }3 H# `$ ]8 U! l
  65.                                         }
    , s. Y( x- r+ i/ V; ~! u
  66.                 }
    # X# |+ _' {* ~* F# w# F# |; `
  67.    }          
    ) {9 g2 D% R# x# S, m
  68.                 myfree(SRAMIN,fileinfo.lfname);9 X4 F# M$ i2 [$ U/ t
  69.     return ack;          
    & H- C, y! P  U' y' e
  70. }( P' D/ V& \1 ]! i" t" H% J6 `) b
复制代码
希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
" h) V, Q0 U' A0 W0 |
收藏 评论0 发布时间:2018-6-8 17:52

举报

0个回答

所属标签

相似分享

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