做项目,需求有一个需要保存测试报告。前面已经做了SD卡 FATFS 现在就是整理一个string写到.txt文件。
保存在SD卡即可。
问题是:这个文件叫什么名字?
以前板子又RTC可以用时间来命名,不会冲突。
现在是离线的设备 怎么办?
想了个板子 建立一个文件夹叫TMReport 在文件夹里面写文件名字叫:Report.txt New_Report.txt New_New_Report.txt..这样效果
思路框图:写代码的时候发现后缀挺麻烦,直接str操作头部算了,名字长的就是新生成的文本。
代码:
- FRESULT fr;
- TCHAR str[10];
- char name[50]={0};
- char newname[50]={0};
- void Name_Logic(void)//char *name)
- {
- u8 rval=0;
- DIR SDdir;
- FILINFO SDinfo;
- if(Check_Dir_Exist("0:","TMReport2"))//扫描路径下的文件+子文件夹
- {
- //已经存在 啥也不做
- printf("HAVE DIR");
- }
- else
- {//不存在 创建文件夹
- mf_mkdir("TMReport1");
- printf("HAVE NO DIR");
- }
- //准备切换文件夹
- fr = f_getcwd(str, 10);//此时是0根目录 只是debug看的
- f_chdir("0:/TMReport1");
- fr = f_getcwd(str, 10);//此时已经切换
-
- //目录下找是否有文件
- rval=Check_Dir_Exist_EXT((u8*)"0:/TMReport1","Report",name);
- if(rval)
- {
- Finish+=1;
- printf("HAVE TXT");
- sprintf(newname,"%s_%s","New",name) ;
- }
- else
- {
- Finish+=10;
- printf("HAVE NO TXT");
- strcpy(newname,"Report.txt");
- }
- f_open(&fil,newname,(FA_OPEN_ALWAYS|FA_WRITE));//此时不带路径!已经在前面切换了
- f_close(&fil);
- }
复制代码
看网页http://elm-chan.org/fsw/ff/00index_e.html 边看边做的
主要调用的2个函数是在库函数修改来的。
一个是找:是不是存在这个名字的文件夹 一个EXT是找存在这个系列的找到最长的
- u8 Check_Dir_Exist_EXT(u8 *path,char *name ,char *Targetname)
- {
- FRESULT res;
- u8 ack=0;
- char * location;
- char * target=0;
- char *fn; /* This function is assuming non-Unicode cfg. */
- fileinfo.lfsize = _MAX_LFN * 2 + 1;
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
-
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
- if (res == FR_OK)
- {
- printf("\r\n");
- while(1)
- {
- res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
- printf("%s/", path);//打印路径
- printf("%s\r\n", fn);//打印文件名
- location= strstr(fn,name);
- if(location&&location>target)
- {
- ack=1;
- target=location;
- strcpy(Targetname,fn);
- printf("update!!!\n");
- }
- }
- }
- myfree(SRAMIN,fileinfo.lfname);
- return ack;
- }
- u8 Check_Dir_Exist(u8 *path,char *name )
- {
- FRESULT res;
- u8 ack=0;
- char *fn; /* This function is assuming non-Unicode cfg. */
- fileinfo.lfsize = _MAX_LFN * 2 + 1;
- fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
-
- res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
- if (res == FR_OK)
- {
- printf("\r\n");
- while(1)
- {
- res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件
- if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
- fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
- printf("%s/", path);//打印路径
- printf("%s\r\n", fn);//打印文件名
- if(memcmp(fn,name,strlen(name))==0)
- {
- ack=1;
- printf("Dir_Exist!!!\n");
- break;
- }
- }
- }
- myfree(SRAMIN,fileinfo.lfname);
- return ack;
- }
复制代码 希望大神指点写出很好的逻辑,对FATFS的几个API还在摸一摸阶段
|