fatfs 打开中文文件

[复制链接]
10149|19
 楼主| 331086846 发表于 2011-11-21 20:39 | 显示全部楼层 |阅读模式
在移植文件系统的时候,已经选了长文件名,现在打开英文长文件名已经没问题了,但是打开中文文件就不行,不知道出现什么问题了;附源码:if(f_opendir(&dir,"/") == FR_OK)

  while(f_readdir(&dir, &finfo) == FR_OK)

  {          /*  读目录信息到文件状态结构体中  */
                        if(!finfo.fname[0]) break;                                /*  如果文件名为 0,结束                    */
                        //if(fno.fattrib == AM_ARC )
  /*  如果读取的文件只有存档属性      */

{                     
                                printf("文件名:%s\r\n", (*finfo.lfname ?finfo.lfname : finfo.fname));

sprintf(path,"%s","/");//拼凑文件绝对路径
        
strcat(path,"/");
        
strcat(path,finfo.lfname);

printf("%s\n",path);

res = f_open(&fsrc,path,FA_WRITE | FA_OPEN_EXISTING);

if(res!=FR_OK)

printf("file open fail\n");

res = f_read(&fsrc,buffer,50,&br);

printf("%s\n",buffer);

if(res!=FR_OK)

printf("file READ fail\n");
                        }


      }   QQ截图未命名.jpg
 楼主| 331086846 发表于 2011-11-21 20:42 | 显示全部楼层
图示串口打印出的数据,顺其自然~2.MP3原文件名是顺其自然 黄小琥.MP3,但是好像不支持中文长文件名,而且中文文件.txt也打不开,求各位帮一下
xfcjava2 发表于 2011-11-21 22:15 | 显示全部楼层
是FatFs配置的问题!

ffconf.h
//#define  _CODE_PAGE        437     //...(注释掉此行)
1,  #define _CODE_PAGE        936   
2,  #define  _USE_LFN        1

3,添加 cc936.c    (说明:option文件夹内)
xsgy123 发表于 2011-11-21 22:25 | 显示全部楼层
楼主这发现问题的速度还是很快的,多谢分享
 楼主| 331086846 发表于 2011-11-23 18:32 | 显示全部楼层
3# xfcjava2 的确就是这样配置的,但是不行
xfcjava2 发表于 2011-11-23 20:10 | 显示全部楼层
要增加此选项才可以的:
  #if _USE_LFN
        fno.lfname = Lfname;
        fno.lfsize = sizeof(Lfname);
    #endif
xfcjava2 发表于 2011-11-23 20:14 | 显示全部楼层
......
#if _USE_LFN
        fno.lfname = Lfname;
        fno.lfsize = sizeof(Lfname);
    #endif       
       
    res = f_opendir(&dir,path);   
    if(res != FR_OK) {return FALSE;}
       
    res = f_readdir(&dir,&fno);          
    if(res != FR_OK) {return FALSE;}
    ......
xfcjava2 发表于 2011-11-23 20:16 | 显示全部楼层
增加这一块:
   #if _USE_LFN
         fno.lfname = Lfname;
         fno.lfsize = sizeof(Lfname);
     #endif
再处理你的文件名称,应该就OK了!!!
shuaijing 发表于 2011-11-24 12:48 | 显示全部楼层
我试了可以打开啊。
 楼主| 331086846 发表于 2011-11-24 22:06 | 显示全部楼层
8# xfcjava2 这个肯定是定义了的,不然这个文件名是怎么读出来的,现在关键是英文的长文件名没问题,中文的长文件名读不出来,中文文件名的文件可以打不开,但是英文文件名的文件,里面的中文可以读出来,现在就是中文文件名的问题 QQ截图未啊命名.jpg
uurun 发表于 2011-11-28 11:17 | 显示全部楼层
lz你编译后的文件有多大?  如果你加入了中文文件名的支持 起码有500/600k fatfs自带的中文字库.c文件貌似有600多k
 楼主| 331086846 发表于 2011-11-29 19:28 | 显示全部楼层
 楼主| 331086846 发表于 2011-11-29 19:29 | 显示全部楼层
11# uurun
我是把cc936文件放到片外flash中的,而且好像也没你说的那么大呀
xfcjava2 发表于 2012-2-11 23:27 | 显示全部楼层
给你个实例,你看看吧:
//***********************************************************************************
//* 函数名称:Ex3_FilSearch
//* 功    能:在指定路径下查找指定扩展名和检索号都相符的文件,   
//* 输入参数:
//*     path  :要检索的文件路径
//*     name  :要检索的文件扩展名
//*     s_index: 要检索到的文件条目
//* 输出参数:TRUE 成功   FALSE 出错
//***********************************************************************************
int Ex3_FilSearch(char *path,char *name,INT16U s_index)
{       
        FILINFO fno;
        FRESULT res;
        BYTE i;       
   
        INT16U c_index=0;   
       
        if(s_index==0) //要检索的条目:1...65535
          return FALSE;         
          
        #if _USE_LFN
        fno.lfname = Lfname;
        fno.lfsize = sizeof(Lfname);
            #endif
   
        while (*name == ' ') name++; //skip the "space"
       
       
        res = f_opendir(&search_dir,path);       
               
        if(res != FR_OK) {/*OS_EXIT_CRITICAL();*/return FALSE;}       

        do
        {          
           res = f_readdir(&search_dir,&fno);          
                     
           if(res != FR_OK)
             {/*OS_EXIT_CRITICAL();*/return FALSE;}             
           if(fno.fname[0] == 0)
             break;                         
           i=strlen(fno.fname);        //得到当前查询的文件名长度
          
           if(i>4)//文件名的长度必须大于4(例如*.txt)
            {                      
                      //从文件名的倒数第4个的位置开始比较字符串:比较文件的后缀
                   if(my_memicmp(&fno.fname[i-4],name,4)==0) //不区分大小写比较,格式:例如.MP3                  
                            c_index++;//找到1个符合条件的文件                                
            }          
          
        }while(c_index<s_index);            
   
        if(c_index==s_index )//找到符合条件的文件
        {          
          #if _USE_LFN
            if(fno.lfname[0]!= 0)//如果长文件名有效
            {   
               memcpy(Curr_Fil_buf,fno.lfname,50);                  
               xprintf(":Ofn<%s>\n",fno.lfname); // 输出指定长度的字符串, 超长时不截断, 不足时左对齐:
            }      
            else//如果长文件名无效,输出短文件名
            {
               memcpy(Curr_Fil_buf,fno.fname,13);         
               xprintf(":Ofn<%s>\n",fno.fname); // 输出指定长度的字符串, 超长时不截断, 不足时左对齐:
   
            }
          #else
            if(fno.fname[0]!= 0)
            {   
               memcpy(Curr_Fil_buf,fno.fname,13);              
               xprintf(":Ofn<%s>\n",fno.fname); // 输出指定长度的字符串, 超长时不截断, 不足时左对齐:
            }                
          #endif          
          
            return TRUE;
        }
   else
    {
      return FALSE;       
    }
   
       
}
xfcjava2 发表于 2012-2-11 23:37 | 显示全部楼层
这是绝对好用的实例,请你自己仔细分析,结合我上边的提醒,就可以成功了!
ONLY_MCU 发表于 2013-10-17 16:44 | 显示全部楼层
xfcjava2 发表于 2012-2-11 23:27
给你个实例,你看看吧:
//*************************************************************************** ...

HI,我按照你的方式测试了一下,还是只显示最长13个字节的文件名,并且都是大写的。不论建立的时候是大写还是小写。另外,我开启长文件名后。建立低于8个字节的文件名时,是区分大小写的,超过了就全都是大写了,还望指点下问题所在。多谢!
新手多多指教 发表于 2014-5-9 14:02 | 显示全部楼层
请问楼主这个问题解决没?我也正好碰到了这个问题,急需解答啊!!!!!!!!!!
夜夜 发表于 2014-5-10 00:38 | 显示全部楼层
支持中文文件名,得加入Unicode编码,程序文件里面,有个编码表加入进去就可以支持长中文名了。
新手多多指教 发表于 2014-5-10 14:47 | 显示全部楼层
夜夜 发表于 2014-5-10 00:38
支持中文文件名,得加入Unicode编码,程序文件里面,有个编码表加入进去就可以支持长中文名了。 ...

我在SD卡中加入了cc936.c中的两个数组啊,能读取英文文件名中的汉字内容,不能打开中文文件名的文件,同时读取的中文文件名也显示不全,请问怎么办??
122541325 发表于 2014-12-2 15:13 | 显示全部楼层
楼主解决了么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部