OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 22717|回复: 9

Fatfs 关于长文件名和短文件名的读取

[复制链接]

10

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2012-10-11
在线时间
15 小时
发表于 2013-8-8 14:15:05 | 显示全部楼层 |阅读模式

我想问一下原子哥在FATFS系统里是怎么判断是长文件名还是短文件的,假如我设置了长文件的读取后,读文件时当读到短文件的时候是按照长文件来读取还是短文件读取啊,下面的这句if(res!=FR_OK||tfileinfo.fname[0]==0)break;  假如我SD卡里面存的都是长文件名那他会不会跳出wehile循环。





u16 pic_get_tnum(u8 *path)

{      

       u8 res;

       u16 rval=0;

      DIR tdir;             //临时目录

       FILINFO tfileinfo; //临时文件信息    

       u8 *fn;                                                                   

     res=f_opendir(&tdir,(const TCHAR*)path); //打开目录

      tfileinfo.lfsize=_MAX_LFN*2+1;                                    //长文件名最大长度

       tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize); //为长文件缓存区分配内存

       if(res==FR_OK&&tfileinfo.lfname!=NULL)

       {

              while(1)//查询总的有效文件数

              {

               res=f_readdir(&tdir,&tfileinfo);                    //读取目录下的一个文件

               if(res!=FR_OK||tfileinfo.fname[0]==0)break;      //            

   fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);//
判断是长文件名还是短文件名如果是长文件名就取长文件名否则就去短文件名的信息                 

                     res=f_typetell(fn); 

                     if((res&0XF0)==0X50)//取高四位,看看是不是图片文件 

                     {

                            rval++;//有效文件数增加1

                     }        

              } 

       }

       return rval;

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 14:59:58 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2012-10-11
在线时间
15 小时
 楼主| 发表于 2013-8-8 15:07:00 | 显示全部楼层
那如果我SD卡存的是长文件的话当执行到这句 if(res!=FR_OK||tfileinfo.fname[0]==0)break;就跳出while循环了是吗,还有就是 这句tfileinfo.lfsize=_MAX_LFN*2+1;  这样支持的文件名最大多少个字节啊为啥要  这样设置啊。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 15:07:49 | 显示全部楼层
回复【3楼】MDC012170:
---------------------------------
别猜测了
你直接测试吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2012-10-11
在线时间
15 小时
 楼主| 发表于 2013-8-8 15:14:48 | 显示全部楼层
恩好的。
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-8-8 21:40:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
发表于 2016-4-19 10:55:19 | 显示全部楼层
xouou_53320 发表于 2013-8-8 21:40
长文件名标志位0x0F

长文件名标志位是不是lfname[0]
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2016-8-8
在线时间
109 小时
发表于 2017-2-23 10:03:36 | 显示全部楼层
本帖最后由 colwer 于 2017-2-23 10:05 编辑

[mw_shl_code=c,true]void Find_FileName(void)
{
        const CHAR path[]="/";
        
        unsigned short i;
        FRESULT res=0;

/*长文件名支持*/        
#if _USE_LFN
        static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
        finfo.lfname = lfn;
        finfo.lfsize = sizeof(lfn);
#endif


        /*挂载文件系统*/
        while(SD_Init()!=0)
//        GUI_DispStringAt("it is no ok!\r\n",50,100);
        res = f_mount(0, &fs);
        res=f_opendir(&dirs, path);
        if(res!=0)
        {
                __nop();
                __nop();
                while(1);
        }


        if (res == FR_OK) {/*如果打开主目录成功*/
               
                while (f_readdir(&dirs, &finfo) == FR_OK){/*通过dirs,依次阅读文件名,知道末尾*/
                        
                                   
                        if(finfo.fattrib & AM_DIR){         /*是目录就结束本次循环*/
                                continue;        
                        }
                        if (finfo.fattrib & AM_ARC) { /*刚打开的文件属性是存档文件,*/
                                
                                if(!finfo.fname[0])         break; /*文件尾,跳出while*/               
                                if(finfo.lfname[0]){/*长文件名        */
                                        i = (unsigned char )strlen(finfo.lfname);/*求文件名的长度,求出之后得到后缀*/

                                        if((finfo.lfname[i-3]=='t') && (finfo.lfname[i-2]=='x') && (finfo.lfname[i-1]=='t')){
                                                strcpy(TXT_Files[TXT_NUM],(const char *)finfo.lfname);
                                                TXT_NUM++;
                                        }
                                        else if((finfo.lfname[i-3]=='b') && (finfo.lfname[i-2]=='m') && (finfo.lfname[i-1]=='p')){
                                                strcpy(BMP_Files[BMP_NUM],(const char *)finfo.lfname);
                                                BMP_NUM++;
                                        }
                                }
                                else{        /*短文件名*/
                                        i = (unsigned char )strlen(finfo.fname);/*求文件名的长度,求出之后得到后缀*/

                                        if((finfo.fname[i-3]=='T') && (finfo.fname[i-2]=='X') && (finfo.fname[i-1]=='T')){
                                                strcpy(TXT_Files[TXT_NUM],(const char *)finfo.fname);
                                                TXT_NUM++;
                                        }
                                        else if((finfo.fname[i-3]=='B') && (finfo.fname[i-2]=='M') && (finfo.fname[i-1]=='P')){
                                                strcpy(BMP_Files[BMP_NUM],(const char *)finfo.fname);
                                                BMP_NUM++;
                                        }        
                                }
                        }
                }        
        }
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-4-12
在线时间
1 小时
发表于 2017-4-12 09:15:07 | 显示全部楼层
可以试下 ranfs fat 文件系统  支持长文件名的打开创建等
https://www.oschina.net/p/ranfs
回复 支持 反对

使用道具 举报

13

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2019-12-17
在线时间
58 小时
发表于 2020-2-26 15:37:37 | 显示全部楼层
我想问一下楼主如果都是长文件的话,会不会在第一次循环的时候就直接推出呢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 21:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表