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

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

[复制链接]
GKoSon 发布时间:2018-6-8 17:52
做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。# P0 W; ^) m6 J: S' ?1 D
保存在SD卡即可。; C/ Q* h/ S6 @& Q4 O
问题是:这个文件叫什么名字?2 W5 T7 R' L- l; l- X* }
以前板子又RTC可以用时间来命名,不会冲突。3 a5 i1 z& q8 l2 P' B; F, q
现在是离线的设备 怎么办?* M5 s5 J5 K9 W; @* s
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt  New_Report.txt New_New_Report.txt..这样效果' m& K/ a- P" i6 g* e2 a  R6 u. `, f
2222.png . R8 G! P) l0 Z! [- G
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。- J, l1 Z& k% M8 y9 a7 C7 `
333.png 2 J& v/ _: F; W4 x) ]) t
代码:$ B; G# Z8 h% U6 W, k
  1.    FRESULT fr;
    + O8 o' S+ [0 N
  2.     TCHAR str[10];
    7 d$ ^# p) L+ a, i% a1 G* N0 p# D

  3. 8 s+ L& u, N( [) F0 l2 b( G5 c! @
  4.         char name[50]={0};
    , N1 q# G& @7 l! \' l& U% b
  5.         char newname[50]={0};: g/ Z' |* L& D- _3 w0 G$ A% s
  6. void Name_Logic(void)//char *name)
    8 r' Y. l, g8 l/ `7 a) `
  7. {- {! J. m# H' }" d2 U3 y0 ?
  8.         u8 rval=0;; f6 L" c2 P$ N! Y9 R* n9 ^, q
  9.         DIR SDdir;       
    : e* a8 o' [% a, k8 B, Y
  10.         FILINFO SDinfo;
      L/ E# M8 H$ E4 `: i8 S9 z

  11. & q1 T+ v0 A3 c1 p* ?: F0 @
  12.         if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹1 l9 K1 \1 n6 a" @0 }' x
  13.         {: k! X& ^7 V) F- S8 l
  14.         //已经存在 啥也不做9 \3 Z: a7 E7 {
  15.                 printf("HAVE DIR");( c) Y. N' y* O6 ]5 R/ @1 h$ r
  16.         }
    4 t6 J( M; F! n6 r! M$ ~! p5 a7 C
  17.         else6 k0 s: D$ s  ^
  18.         {//不存在 创建文件夹; @' r6 q/ x5 r$ R' Q
  19.                 mf_mkdir("TMReport1");* [. N& j3 t4 M0 t+ |
  20.           printf("HAVE NO DIR");                & \4 `4 O1 b, U+ Q! k" t3 G6 r+ }& @
  21.         }
    6 C% ^4 ?2 y0 g3 E% n% Z2 A: ~& Y
  22.         //准备切换文件夹
    " e5 W+ x9 ?: T) Q( B3 H
  23.         fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
    + }, F) y# G1 r( h! ?* V
  24.         f_chdir("0:/TMReport1");6 G6 E9 q) C1 v) W: L; A
  25.         fr = f_getcwd(str, 10);//此时已经切换
    ; ~0 p9 ?# d! M% _# {
  26.         ! q( B9 `# d# k% C' `4 d/ q
  27.         //目录下找是否有文件9 ?" ~0 w% m! a
  28.         rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);! t+ L5 P9 ?: X
  29.         if(rval)
    5 }/ g4 w, Z' M8 L6 B, t4 u$ S! H0 b
  30.         {
    9 F, W6 i- n- }7 p( z! I- z
  31.                 Finish+=1;
    8 w8 l# ]4 i/ \4 z
  32.                 printf("HAVE TXT");6 _2 K0 @  V8 x! R6 n. l8 `+ h
  33.           sprintf(newname,"%s_%s","New",name) ;$ x) u" J- S2 f# C! N' a
  34.         }5 y- S4 r( {5 P- B; z0 [
  35.         else5 D0 ^$ G- n, t4 O- i1 m' [1 P
  36.         {' ?) ?+ ^9 @! j$ l; l5 e) A
  37.                 Finish+=10;1 X  Z! E5 Z: B' ?+ b- `3 C
  38.                 printf("HAVE NO TXT");
    5 r$ R( Y/ [, U6 b5 M
  39.                 strcpy(newname,"Report.txt");
    7 F" ?( A; C" I8 e
  40.         }
    ; h( j2 d/ t+ w# `
  41.                 f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了) ~! g* C) v2 j: ~) y
  42.                 f_close(&fil);
    * o% B; o1 }2 ?* @
  43. }( e. X/ S5 Y1 `8 w3 m
复制代码
. b% q/ i" O1 r7 m6 q4 W+ v1 T/ V
; F: G6 V% T3 J2 j+ J' h
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
1 Q4 m* ~! y4 r0 l( I6 G主要调用的2个函数是在库函数修改来的。
3 k$ J. }; B9 S% a( A一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的
1 k3 D& @# H& E5 ^0 O6 c3 p3 F# B0 T
  1. u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)  
    2 F) d5 K1 U$ y7 u8 e8 K/ a, t
  2. {
    ' N0 P, f/ G: m3 n4 [' Y  Z0 D1 o9 o
  3.         FRESULT res;       
    & a% x' n/ i" ^' g/ I- {
  4.         u8 ack=0;
    $ Z" o4 G- u" L# r$ ~) x
  5.   char * location;
    : ?( k/ r  B7 A* W7 Q: H5 k
  6.   char *  target=0;        
    - p  Q3 @4 m7 C, x1 J
  7.   char *fn;   /* This function is assuming non-Unicode cfg. */
    7 B7 w) u, F  F, r

  8. & a# ?: H& [6 l3 x; |
  9.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
    : t" K( M2 i9 ^0 J( o8 }* r: e, [
  10.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);  N7 Z6 w3 D4 E  A6 f/ w
  11.                   1 ]4 z! J$ l1 U. J
  12.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录& Y) F/ x+ C7 p  J- h7 Z
  13.   if (res == FR_OK) 5 K2 K! g. o% U6 J4 c( a  N  O+ r# S6 m
  14.         {        & v& t4 B) s! @) b, G/ d
  15.                 printf("\r\n");
    : j: C5 O- w# ~& o
  16.                 while(1)$ c  Y# ~8 L0 F* o3 E8 C
  17.                 {: @, d( B7 t3 G6 L( b
  18.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件& k/ K# b4 C3 w
  19.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
      {7 R: e$ u# I
  20.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
    ! W# A- ?+ Q/ ^# P# f
  21. : N1 ?; U) z4 C' o+ t/ l6 W5 \
  22.                             printf("%s/", path);//打印路径        : F  \& g7 G$ g& \0 [! V
  23.                             printf("%s\r\n",  fn);//打印文件名         
    4 W9 e1 L2 N/ Y- ^) _' H
  24.                             location= strstr(fn,name);) I; A. n# \6 g0 l0 A4 z( V- _
  25.                                         if(location&&location>target)2 y# V' i8 A" u; [6 T
  26.                                         {% X0 x, z0 _% @; O  O4 e: W
  27.                                                 ack=1;0 ^' q8 U  y4 ~8 o: P
  28.                                                 target=location;8 \, ?2 M+ g# @+ \
  29.                                                 strcpy(Targetname,fn);3 I% S* w1 s+ i0 @# @- L
  30.                                                 printf("update!!!\n");
    8 V6 |0 A$ V1 v, b0 ?
  31.                                         }
    & L" i: Z: j$ c! Q5 Q
  32.                 } , h1 u' B& w8 ~
  33.    }          
    " g" {( d& B* k" E' o  n3 ~
  34.                 myfree(SRAMIN,fileinfo.lfname);' u9 N1 L) r  U$ T
  35.     return ack;          
    8 b3 N; a0 M) w2 t0 Y- v4 q
  36. }
    2 Z8 _. u- M- r: \

  37. / Z, P- k- M) C9 r5 S+ k* M2 |! x
  38. u8 Check_Dir_Exist(u8 *path,char *name )  5 U- e$ h0 c2 |% U
  39. {* D  H2 O. e& `: T# Z
  40.         FRESULT res;        4 Q8 G) }5 w  e
  41.         u8 ack=0;          - v# l1 S# }  G" P: N
  42.   char *fn;   /* This function is assuming non-Unicode cfg. */
    ' E% g2 R, B6 P

  43. 1 ?; W& l# l* o$ ?" \0 j
  44.         fileinfo.lfsize = _MAX_LFN * 2 + 1;
    3 F' x. s/ z0 x- S
  45.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
    . i6 |9 P3 ?) e. \* `0 k5 Q
  46.                   & I- W& J$ `* E) u) U

  47. 3 i4 D' E+ F" _& x! c
  48.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
    2 M* c# W) W  T3 U8 x7 w# b1 _
  49.   if (res == FR_OK)
    " _, l5 s' S4 _+ Q
  50.         {       
    # ~. r% W* q0 L. r2 c
  51.                 printf("\r\n");
    $ K% W* i% g& S
  52.                 while(1)
    ' g+ O6 w' X& W/ f
  53.                 {+ B3 a' F" z. t, j$ d
  54.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件$ [8 r0 b5 f) E3 p$ |" `# _8 E8 I
  55.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出# Q' S/ c" U  m# m2 Q% m3 G  ?
  56.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;" J. j; T) `( D0 [& _) c' q3 ?" n7 u; J; \

  57. ' P0 g2 O" D/ a8 v/ T3 l; w
  58.                             printf("%s/", path);//打印路径       
    0 n1 R9 G$ a7 o- C
  59.                             printf("%s\r\n",  fn);//打印文件名         
    " j. ~/ u  A+ g8 t7 B$ z
  60.                                         if(memcmp(fn,name,strlen(name))==0)
    $ V8 B/ B$ h- K$ u" _& N
  61.                                         {/ z  R5 q3 r4 ^$ W0 q) H4 e, G
  62.                                                 ack=1;: F  B: N+ M" K9 z% y6 y
  63.                                                 printf("Dir_Exist!!!\n");3 D0 X% R9 L; b; G3 ?
  64.                                                 break;- `3 P4 j1 o( G3 }# o
  65.                                         }& y" v3 `+ M6 M/ z; V5 u7 i
  66.                 } 9 A0 i& c$ Z, }& ^
  67.    }          
    , p# N; f9 w+ p; g, ?' r: z
  68.                 myfree(SRAMIN,fileinfo.lfname);, g8 M0 J0 k' I2 v5 u( p
  69.     return ack;          
    # K, N7 T: T8 B$ N2 A; C  \4 d- Z
  70. }& |, u* a% y* ]8 R  X; A" A+ o
复制代码
希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段6 B4 o/ V4 n9 O
收藏 评论0 发布时间:2018-6-8 17:52

举报

0个回答

所属标签

相似分享

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