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

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

[复制链接]
GKoSon 发布时间:2018-6-8 17:52
做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。4 O- \8 t2 z7 T4 P, W1 J$ ]: n
保存在SD卡即可。
: `6 ]! |  H( v" m$ H/ ^5 Q) W! X问题是:这个文件叫什么名字?& Z# \# V# l  `6 K
以前板子又RTC可以用时间来命名,不会冲突。
3 g- m/ b* C, D7 G4 E现在是离线的设备 怎么办?
1 s* O; }) k- P想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt  New_Report.txt New_New_Report.txt..这样效果
5 U4 y  ?' C- j: p& A 2222.png * U# g4 y; m& a% c0 p  {
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
  P. e, |$ n3 R6 ?7 [$ V- ]! O: c 333.png # T) n4 J3 {% u* N
代码:8 m- F$ g4 ?. c, ]6 z1 I; B2 D
  1.    FRESULT fr;
    / Z3 O& U2 J( w7 t  F" l" O
  2.     TCHAR str[10];3 {, n' I  g3 @

  3. % i% U  [7 J& N) i8 w
  4.         char name[50]={0};
    5 o; P8 ]8 [( v8 i6 n0 T. p; F
  5.         char newname[50]={0};( v- W/ H0 I* d7 Z
  6. void Name_Logic(void)//char *name)
    $ f. e2 t( q4 z( ?3 \5 B5 o& U
  7. {. i' o. I) \7 _
  8.         u8 rval=0;
    $ v7 J- u# y8 K5 z: k% e" p) T4 D
  9.         DIR SDdir;       
    ; _6 |% W( x5 i0 @& N% o. s
  10.         FILINFO SDinfo;) E5 m) Z: T  h1 X: s! v! m

  11. $ X2 w8 t0 [8 Z8 A  O
  12.         if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹
    " w7 h$ N/ s& v! h# n
  13.         {
    9 i& g) y/ \8 R4 d8 f5 D+ x  B# N
  14.         //已经存在 啥也不做
    2 m. [' O# m9 i; w
  15.                 printf("HAVE DIR");" s! [" ~  o& ~. O' L3 X4 r: ]
  16.         }- s1 s. l7 w5 s: _  {3 Z2 f
  17.         else
    & P. X7 M0 _, _" {' G  }
  18.         {//不存在 创建文件夹
    $ q0 m; Z$ Q, m. e
  19.                 mf_mkdir("TMReport1");, z* f, H) c9 _! d
  20.           printf("HAVE NO DIR");               
    " L( W1 S( F5 w# z4 w( j3 Y
  21.         }% t! q% B9 [' u8 k
  22.         //准备切换文件夹4 I/ p7 [6 b9 b$ G3 N1 ~
  23.         fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的, ~8 X1 |. O7 H( d  W& b
  24.         f_chdir("0:/TMReport1");; n' h4 F- X$ g4 n: I; ?* X
  25.         fr = f_getcwd(str, 10);//此时已经切换; \0 M- @* w+ q3 ]' b
  26.        
    ' ~: ]0 ?8 q+ N7 o: M, W+ s8 I8 l
  27.         //目录下找是否有文件5 F) ?, _0 s3 ~, q' Z7 R2 K
  28.         rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
    / d- k* [; g) O0 Z/ V; @
  29.         if(rval)
    8 l9 G" R4 |* _' |* D" v2 a/ d4 b/ j
  30.         {
    ' s# n# X$ p; Q6 c& z9 b$ V
  31.                 Finish+=1;
    % o- P6 _6 x  }( T; X! c$ p
  32.                 printf("HAVE TXT");: a5 k5 d1 x; A# E$ t
  33.           sprintf(newname,"%s_%s","New",name) ;
    ; @3 r& u8 P, X3 v9 ~- t
  34.         }
    1 E& N6 N  ~  p7 V+ J# U: B) u8 ^* k
  35.         else1 c& E: ~' |- z  l' H1 @
  36.         {. ~9 i3 t: k" d! b  K$ N
  37.                 Finish+=10;# V& R) k$ M5 l- G
  38.                 printf("HAVE NO TXT");
    ( t: a0 V3 N0 h1 a" q
  39.                 strcpy(newname,"Report.txt");: U5 X1 L3 J' E( G" N3 S
  40.         }6 r* ~# L, R, c- y
  41.                 f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了6 j& B+ H% d8 S: w
  42.                 f_close(&fil);
    # e- J  N9 G$ U8 a
  43. }5 k+ b9 Y$ c& m
复制代码
- I! @# d+ N6 a2 _6 l# X/ F
- ?- z2 }3 s+ h3 O( B- M
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的 . ^. o! D: f7 `' _: u: ~; i0 Q
主要调用的2个函数是在库函数修改来的。% Y! `1 ]6 W  Z" ~
一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的* C+ P/ @; o8 I
  1. u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)  3 v9 X' Z; T: o# j, K- _3 Y$ ?+ l
  2. {, J, M* a( ?$ G2 T
  3.         FRESULT res;        ; B* k3 c* \8 m/ `8 G5 S5 {% o
  4.         u8 ack=0;+ G' J6 N) ~# b1 _7 F6 Y2 L; n
  5.   char * location;
    1 \1 R# `3 S/ }, F
  6.   char *  target=0;         0 l; X- j* p7 ?$ b
  7.   char *fn;   /* This function is assuming non-Unicode cfg. */, q8 s/ ^/ }( d8 ]6 h  @
  8. ; u; F) m. R$ N+ G7 ]* `
  9.         fileinfo.lfsize = _MAX_LFN * 2 + 1;; P2 C& e& Y! E$ g6 }! c
  10.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
    : C8 }5 I, ^) e5 A! c( O+ c
  11.                   
    5 Q6 a( \8 t2 M& w; u
  12.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录; l: ^& V: ~8 g+ d' {: P
  13.   if (res == FR_OK)
    , d( u8 i; b4 h/ C
  14.         {       
    0 b. C; f8 o7 G8 D0 X" {4 D
  15.                 printf("\r\n"); ) l$ A3 u. ?0 n4 M" T
  16.                 while(1)
    % R, A' @7 Y! s5 u5 l
  17.                 {
    - @! T0 s7 x2 e  |* c
  18.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件
      w- O6 c6 z0 {' [8 |
  19.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
    + U& d. R/ ]7 h. @# y1 |" C" ~0 @
  20.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
    0 Q4 j  }) _, Q$ o) w3 ]
  21. 5 m5 E5 D8 q2 s, L& M0 R
  22.                             printf("%s/", path);//打印路径       
    , q# q3 v: S  y# R6 }
  23.                             printf("%s\r\n",  fn);//打印文件名         7 E# W% K7 |' @3 q, P' v0 [  y
  24.                             location= strstr(fn,name);
    / X9 N/ @  L* T) B' B  s( S
  25.                                         if(location&&location>target)4 Y$ ~. ?3 d* f$ y. O  I" M- ]
  26.                                         {/ Z+ ^7 ~0 V0 A2 A
  27.                                                 ack=1;
    / d8 V% H( x. c( N  V( b& V
  28.                                                 target=location;  P) J1 S1 l" Y$ I4 E4 s
  29.                                                 strcpy(Targetname,fn);
    & y4 ]. Q# Z* {5 T  M% B, W
  30.                                                 printf("update!!!\n");
    ( v) M9 j( ?5 F: ^3 ^& y6 s) }
  31.                                         }
    6 l  {, S+ Y. c* F+ F- Q
  32.                 } $ n5 S/ q5 O( t
  33.    }          ( q5 L8 ~5 u8 K9 X- p
  34.                 myfree(SRAMIN,fileinfo.lfname);. W8 j9 w' f2 e4 s  X5 u
  35.     return ack;          
    6 k" K: N9 a5 f! E
  36. }5 |/ z% P- ~3 s; |! ]4 g

  37. 2 o6 X( A2 d& Q
  38. u8 Check_Dir_Exist(u8 *path,char *name )  5 e" f5 n: ?' I7 [5 f* w
  39. {, e1 v( \) N$ ~: m
  40.         FRESULT res;        / G% Q- n: t# X3 `2 \  S
  41.         u8 ack=0;          
      F3 \8 {! d$ Q, h1 `) C2 ]
  42.   char *fn;   /* This function is assuming non-Unicode cfg. */- T( d5 e6 n% J: i5 f( ^/ h
  43. 2 `0 P- p+ ~& e3 F9 ^+ A) C: n
  44.         fileinfo.lfsize = _MAX_LFN * 2 + 1;# m9 B. `2 D6 r: B. j/ ]
  45.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);8 b' s" ]( |1 ]8 u. g
  46.                   
    ) Z( j" {  g# O: S

  47. $ B5 L. ]* B4 I; ?
  48.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录( W, t& h2 n" Z5 R& p
  49.   if (res == FR_OK)
    5 `( [" V7 j# p4 P9 }& o
  50.         {        0 \8 G8 P3 V* y& i$ m8 j
  51.                 printf("\r\n"); # p/ o3 Y5 f/ y# ~. x4 k
  52.                 while(1)5 ]6 [" f% r# \9 R2 }5 ^$ _- w
  53.                 {
    ; X) D+ O& H" N2 @. y4 B( M
  54.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件. Z8 @1 n. _# s" u! K9 n
  55.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出9 f; w) y. T- d. b( E' E
  56.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
    , {! U( @+ G8 a( Q% }& m1 a; @9 X

  57. . w) d  m- |( _4 Z
  58.                             printf("%s/", path);//打印路径       
    ; p% U4 V( t! {  N3 }
  59.                             printf("%s\r\n",  fn);//打印文件名         
    1 S+ l2 _* z9 T) c/ r7 T8 d, U
  60.                                         if(memcmp(fn,name,strlen(name))==0)
    & A7 O- _* M! [5 X, Y. C
  61.                                         {- n/ k8 V6 [% x: u2 S" r
  62.                                                 ack=1;
    - ]0 a( ^: ]+ T2 }
  63.                                                 printf("Dir_Exist!!!\n");: e6 @  H) M8 n2 T0 n; w0 A+ b
  64.                                                 break;6 C0 t7 N7 h/ \4 l
  65.                                         }4 H' t3 M% h/ h6 b- F; X# M& K
  66.                 } ; `$ _# k; f& e* |0 l* R: K
  67.    }          
    ( w; ^0 L# X! R9 h9 R
  68.                 myfree(SRAMIN,fileinfo.lfname);9 l3 O% V7 p& D% P5 f* [' K1 |
  69.     return ack;          
    & q, [6 T/ s5 v3 h: f7 p7 o1 O
  70. }
    $ C! Q8 G+ F% |1 q$ `2 d- E8 T
复制代码
希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
' O  ~% f' N, w" s4 k
赞 收藏 评论0 发布时间:2018-6-8 17:52

举报

0个回答

所属标签

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