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

2019-08-22 14:06发布

我想问一下原子哥在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; }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
huajia
2019-08-23 15:07
本帖最后由 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! ",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]

一周热门 更多>