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

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

[复制链接]
GKoSon 发布时间:2018-6-8 17:52
做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。5 V. d  C5 C9 U; u) @* V
保存在SD卡即可。
% B: Q1 n( H3 t/ q问题是:这个文件叫什么名字?5 _& E* @5 W  U! w2 y7 H! {! s
以前板子又RTC可以用时间来命名,不会冲突。
0 w9 F; X& O2 u# Y3 W, d) Q/ O( F现在是离线的设备 怎么办?
' D1 K* d+ U6 w3 }想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt  New_Report.txt New_New_Report.txt..这样效果5 A' t  V+ H  v. |' x5 @
2222.png
5 d$ Q' W& l/ ]  B思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。$ Y3 ]0 q7 f  D' `
333.png , ~5 Q1 w# s3 ^0 X0 ]
代码:
% s( [5 l' n% b
  1.    FRESULT fr;; x+ c# C3 H' g0 ]6 f
  2.     TCHAR str[10];7 n" N8 v* f7 j0 i

  3. 5 g  e- t$ u/ F1 p% Y
  4.         char name[50]={0};
    / w, L3 x! O5 I  c, s
  5.         char newname[50]={0};
    7 B; v8 O$ i) a3 w: Q
  6. void Name_Logic(void)//char *name)# k! L; L4 ~2 P7 ]  V
  7. {
    7 f2 X6 Y- Y7 [$ z
  8.         u8 rval=0;
    + i" z8 [( X4 D9 C+ O
  9.         DIR SDdir;        . E+ |& S$ {6 j6 l
  10.         FILINFO SDinfo;
    0 F( g: u+ h' r/ h
  11. ' o0 k/ |( x; T; |
  12.         if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹( X0 N0 x) \& \/ T7 I5 {
  13.         {0 u! b, `8 G4 `$ b/ N( P$ b5 B
  14.         //已经存在 啥也不做& k/ I8 t" S; [3 m$ W' |
  15.                 printf("HAVE DIR");
    # r) g, e  s5 m5 ^- W9 g- U$ p
  16.         }/ n( a; g# w: r5 Q
  17.         else. F1 J2 k+ D1 N: a& ~& k
  18.         {//不存在 创建文件夹
    9 [5 j6 |5 `# O; {2 [9 w* f
  19.                 mf_mkdir("TMReport1");8 i7 [/ `7 {, g; t* W" D* x
  20.           printf("HAVE NO DIR");               
    7 ?) D- ]- z2 A7 y1 f" }
  21.         }# k* I  q: @/ ?; Y# v# v) Q% |# M
  22.         //准备切换文件夹# X' t& C( r. V8 r- m
  23.         fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的, C! z8 m8 N0 n8 w0 c0 q' Z
  24.         f_chdir("0:/TMReport1");
    ! z1 l6 J4 }$ R  i
  25.         fr = f_getcwd(str, 10);//此时已经切换
    8 M# }8 x$ i/ W6 c( d$ m6 L6 I- K
  26.        
    $ n. f' V1 j6 _5 N  H5 [* }0 G2 f
  27.         //目录下找是否有文件" u% h1 g. u2 ?2 \4 e/ l8 P9 K
  28.         rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
    8 s" i- i) [1 F
  29.         if(rval)
    $ u7 v5 g% z7 q! E! D4 f
  30.         {: N: p+ x2 c  @# B3 Y% U2 F
  31.                 Finish+=1;8 M: B1 Z8 q7 N, q5 x  P
  32.                 printf("HAVE TXT");. f6 Y" M6 `1 W0 k# g; R" R& H, k8 M
  33.           sprintf(newname,"%s_%s","New",name) ;% l0 j0 n  v8 M' Y: r0 A
  34.         }
    ; e, U$ b* x* X
  35.         else
    2 b! u: m/ b3 ]; n& E' [
  36.         {
    4 q3 Q4 n0 @. n+ z
  37.                 Finish+=10;( w# P; ^8 c7 X6 V7 C
  38.                 printf("HAVE NO TXT");1 @& U  O# }$ ~7 H+ ?# G
  39.                 strcpy(newname,"Report.txt");, z$ o( Y( j- d" [
  40.         }) {6 O: H) e0 Z# a6 _# v  G
  41.                 f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了+ D, N8 H' O9 o
  42.                 f_close(&fil);
    - s' p1 I% |. j  [6 Z& n1 c" W
  43. }& j9 @% ?0 E, R1 r9 x
复制代码
7 z( _1 B4 k2 v6 m" m5 m

0 Q4 Q" {0 c+ ^  b看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
0 r- Z/ B, X: F' ~5 y0 ^主要调用的2个函数是在库函数修改来的。5 q. [( n( _; s; e) ]( X5 u
一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的  l% z; G" S* z' Q: e' u
  1. u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)  & ~3 d0 Z! {% E
  2. {- j3 ^0 I* x$ \9 p
  3.         FRESULT res;        8 y% E0 W7 W1 h1 |2 p9 b2 |
  4.         u8 ack=0;
    & |0 V+ V" c% B) t  }' y& ?
  5.   char * location;
    . d  f% g1 u* @3 i5 V. [5 m, y! `
  6.   char *  target=0;        
    # H( \3 o( F. P4 r/ `
  7.   char *fn;   /* This function is assuming non-Unicode cfg. */
      ^2 L1 j( c- a6 T/ i

  8. * O+ {7 N: [0 D9 ~7 K2 ~- }3 ^
  9.         fileinfo.lfsize = _MAX_LFN * 2 + 1;& ?1 r- @% h7 D( y% m
  10.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);* F! S% t) e0 I0 T
  11.                   + b7 M- q, G7 G  L0 L
  12.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录8 z  `& T& l7 A/ C
  13.   if (res == FR_OK) 9 m: c7 H# D4 T; I6 o
  14.         {        $ I4 f( S' B7 y( l4 z
  15.                 printf("\r\n");
    4 p: l! T3 |$ k4 s9 }& e2 N
  16.                 while(1)
    % V: L# O/ h6 b7 ~$ d8 h
  17.                 {
    " {. l! ?6 m! n
  18.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件; Q9 J: h$ X, _  Q; W
  19.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
    : i5 d1 {* ^: i# x3 c, f+ F+ {
  20.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;/ l% T0 `* h, M% ^1 }. a

  21. $ G" Q3 X, K* Q' N' {: U0 f# G2 M
  22.                             printf("%s/", path);//打印路径        8 ?8 N' p2 e- B6 i" {# E
  23.                             printf("%s\r\n",  fn);//打印文件名         
    6 g; Z$ A6 p9 B% R
  24.                             location= strstr(fn,name);
    1 _  x; v4 ?% Y: {/ N$ d' g. i
  25.                                         if(location&&location>target)& r. [% l- h) V+ a, O. `; Q" l  B
  26.                                         {, C( q, x" ]9 q' z! I- J* F8 ]9 k7 j: g
  27.                                                 ack=1;9 Q, @7 T. g' P/ i( J4 n
  28.                                                 target=location;5 m) U# L+ P( O4 C6 }& x6 D4 U
  29.                                                 strcpy(Targetname,fn);
    ; p$ N! N# N3 B, H
  30.                                                 printf("update!!!\n");
    & [5 z; O! U) o. x. r
  31.                                         }
    ! y6 ?9 v/ i! w
  32.                 } ( E" u3 d: i2 y# @' C+ ~
  33.    }            x& n1 `- Z7 B1 M! j% M7 C+ C
  34.                 myfree(SRAMIN,fileinfo.lfname);
    + d5 S1 T' }. O! @% I" F, i
  35.     return ack;          3 R, t9 r* N. }0 V
  36. }
    4 @. h* I- }: W, [
  37. 0 f" S: ~. p  j0 `, F
  38. u8 Check_Dir_Exist(u8 *path,char *name )  1 S  N) s. a, N! b, p
  39. {
      [! b" l+ }/ o4 u0 k
  40.         FRESULT res;        ( g3 s1 q' ]1 {1 f
  41.         u8 ack=0;          
    ' c$ L7 u! n* |; k
  42.   char *fn;   /* This function is assuming non-Unicode cfg. */
    1 s5 {4 x& O. B1 W' q

  43. 6 ^; Y5 \, L! F% ]% y8 s0 c
  44.         fileinfo.lfsize = _MAX_LFN * 2 + 1;6 e" V5 y) @/ u' M
  45.         fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
    3 L* |' c2 D! I4 l( D# [+ G" O
  46.                   7 X  F: L4 x- U; M) F! ?' Q
  47. 0 w. c6 E7 C) t) }8 x, V
  48.   res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
    ' a, E6 r* j) Q: {1 P3 F
  49.   if (res == FR_OK)
    * c# ]) r* l# F7 M/ Z5 j
  50.         {        5 q! F, E; @5 |; n) _( G. p6 u/ G
  51.                 printf("\r\n"); 5 w: t1 }1 ~) N6 s6 Z* u
  52.                 while(1)
    & K" u* c/ q6 U% B. |
  53.                 {  D- F: V( ~  J3 W7 [
  54.                 res = f_readdir(&dir, &fileinfo);                   //读取目录下的一个文件; d/ `1 W) N" `4 o7 n
  55.                 if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
    3 T2 E: X- c9 l1 Z5 l& R$ G/ ^
  56.                 fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;( U6 y, w9 P: l
  57. , P& ^8 e/ T5 F! n4 r. r7 B/ j1 i
  58.                             printf("%s/", path);//打印路径        1 y! x& D, {3 F9 k& W
  59.                             printf("%s\r\n",  fn);//打印文件名         
    + N: i* H, y5 ~5 Q5 h9 {
  60.                                         if(memcmp(fn,name,strlen(name))==0)3 `6 L3 g! Y9 ^' Y
  61.                                         {
    2 k! P. D) W6 [- c  Z" G# T
  62.                                                 ack=1;" r1 s3 e/ u* h7 l
  63.                                                 printf("Dir_Exist!!!\n");
    0 _; U) A( U% k
  64.                                                 break;
      B: J1 {$ ?' ]; a5 s7 V8 D* b
  65.                                         }( {- R- ^7 S. R6 y) G  z
  66.                 }
    ! f. t" Y! `/ V% n& n1 d2 |0 R
  67.    }          1 S7 L2 A7 V, ^% O
  68.                 myfree(SRAMIN,fileinfo.lfname);9 w9 u% S1 |% e1 g: w9 ]
  69.     return ack;          
    9 {1 e; y  \% O. e4 x: }
  70. }2 ~# K) W* V9 ^) O4 Z* @# D
复制代码
希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
8 A4 ]8 Q1 Z% d" i0 M7 M+ X
收藏 评论0 发布时间:2018-6-8 17:52

举报

0个回答

所属标签

相似分享

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