打印

fatfs 打开中文文件

[复制链接]
9363|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");
                        }


      }  
沙发
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 | 只看该作者
楼主这发现问题的速度还是很快的,多谢分享

使用特权

评论回复
5
331086846|  楼主 | 2011-11-23 18:32 | 只看该作者
3# xfcjava2 的确就是这样配置的,但是不行

使用特权

评论回复
6
xfcjava2| | 2011-11-23 20:10 | 只看该作者
要增加此选项才可以的:
  #if _USE_LFN
        fno.lfname = Lfname;
        fno.lfsize = sizeof(Lfname);
    #endif

使用特权

评论回复
7
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;}
    ......

使用特权

评论回复
8
xfcjava2| | 2011-11-23 20:16 | 只看该作者
增加这一块:
   #if _USE_LFN
         fno.lfname = Lfname;
         fno.lfsize = sizeof(Lfname);
     #endif
再处理你的文件名称,应该就OK了!!!

使用特权

评论回复
9
shuaijing| | 2011-11-24 12:48 | 只看该作者
我试了可以打开啊。

使用特权

评论回复
10
331086846|  楼主 | 2011-11-24 22:06 | 只看该作者
8# xfcjava2 这个肯定是定义了的,不然这个文件名是怎么读出来的,现在关键是英文的长文件名没问题,中文的长文件名读不出来,中文文件名的文件可以打不开,但是英文文件名的文件,里面的中文可以读出来,现在就是中文文件名的问题

使用特权

评论回复
11
uurun| | 2011-11-28 11:17 | 只看该作者
lz你编译后的文件有多大?  如果你加入了中文文件名的支持 起码有500/600k fatfs自带的中文字库.c文件貌似有600多k

使用特权

评论回复
12
331086846|  楼主 | 2011-11-29 19:28 | 只看该作者
11# uurun

使用特权

评论回复
13
331086846|  楼主 | 2011-11-29 19:29 | 只看该作者
11# uurun
我是把cc936文件放到片外flash中的,而且好像也没你说的那么大呀

使用特权

评论回复
14
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;       
    }
   
       
}

使用特权

评论回复
15
xfcjava2| | 2012-2-11 23:37 | 只看该作者
这是绝对好用的实例,请你自己仔细分析,结合我上边的提醒,就可以成功了!

使用特权

评论回复
16
ONLY_MCU| | 2013-10-17 16:44 | 只看该作者
xfcjava2 发表于 2012-2-11 23:27
给你个实例,你看看吧:
//*************************************************************************** ...

HI,我按照你的方式测试了一下,还是只显示最长13个字节的文件名,并且都是大写的。不论建立的时候是大写还是小写。另外,我开启长文件名后。建立低于8个字节的文件名时,是区分大小写的,超过了就全都是大写了,还望指点下问题所在。多谢!

使用特权

评论回复
17
新手多多指教| | 2014-5-9 14:02 | 只看该作者
请问楼主这个问题解决没?我也正好碰到了这个问题,急需解答啊!!!!!!!!!!

使用特权

评论回复
18
夜夜| | 2014-5-10 00:38 | 只看该作者
支持中文文件名,得加入Unicode编码,程序文件里面,有个编码表加入进去就可以支持长中文名了。

使用特权

评论回复
19
新手多多指教| | 2014-5-10 14:47 | 只看该作者
夜夜 发表于 2014-5-10 00:38
支持中文文件名,得加入Unicode编码,程序文件里面,有个编码表加入进去就可以支持长中文名了。 ...

我在SD卡中加入了cc936.c中的两个数组啊,能读取英文文件名中的汉字内容,不能打开中文文件名的文件,同时读取的中文文件名也显示不全,请问怎么办??

使用特权

评论回复
20
122541325| | 2014-12-2 15:13 | 只看该作者
楼主解决了么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

1

粉丝