野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19767|回复: 7

请教一点关于FATFS的一些问题。。。(文件名由小写变成了大写)

[复制链接]
发表于 2014-5-24 10:37:02 | 显示全部楼层 |阅读模式
用FATFS读取文件目录的时候,发现一些莫名的问题:

我想读取0:/Pic下所有文件,用串口打印出来:

用的是 2-野火M3-FATFS代码:

结果是这样:

这是一个MicroSD卡文件系统实验(FATFS R0.09)
disk_initialize starting......
  长文件名:
短文件名 :.
长文件名:
短文件名 :..
长文件名:新建文件夹
短文件名 :新建文~1
长文件名:新建文件夹 (2)
短文件名 :新建文~2



长文件名:
短文件名 :testtt.bmp


长文件名:
短文件名 :tesddd.bmp

长文件名:BacPic5.bmp
短文件名 :BACPIC5.BMP

长文件名:BacPic4.bmp
短文件名 :BACPIC4.BMP

长文件名:图片BacPic2.bmp
短文件名 :图片BA~1.BMP

长文件名:
短文件名 :


有的有短文件名没有长文件名。。
有的问题件长文件名和短文件名都有,但是短文件名小写变成了大写

int main(void)
{       
           char lfn[70];             /*为支持长文件的数组,[]最大支持255*/
//        char Path[100];

   /* USART1 config */
        USART1_Config();

        /* Interrupt Config */
        NVIC_Configuration();
        printf("\r\n 这是一个MicroSD卡文件系统实验(FATFS R0.09)\n");
        printf ( "\r\n disk_initialize starting......\n " );
        f_mount(0,&fs);                  
        finfo.lfname = lfn;                   //为长文件名分配空间
        finfo.lfsize = sizeof(lfn);   //空间大小

        if(f_opendir(&dirs,"0:/Pic")==FR_OK);
        {
//                res=f_chdir("0:/pic");
                while (f_readdir(&dirs, &finfo) == FR_OK)  
                {
                        //if(finfo.lfname[0] == NULL && finfo.fname !=NULL) // 当长文件名称为空,短文件名非空时转换
                        //finfo.lfname =finfo.fname;
                        printf( "\r\n 长文件名:%s \r\n", finfo.lfname );
                        printf( "\r\n 短文件名 :%s \r\n", finfo.fname );
                        if(strstr( finfo.fname, ".bmp" )!=NULL)
                        {
//                                sprintf(Path,"%s/%s","0:/Pic",finfo.lfname);                               
                                //DisplayString(0, 0, finfo.lfname);
                                //printf( "\r\n 路径 :%s \r\n", Path);
//                                printf( "\r\n 长文件名:%s \r\n", finfo.lfname );
//                                printf( "\r\n 短文件名 :%s \r\n", finfo.fname );       
                        }
                }
                         
        }

         
  while (1)
  {}
}

折腾了几天了,没找到原因,求教。。谢谢。。

回复

使用道具 举报

发表于 2014-5-24 10:39:32 | 显示全部楼层
如果你替换了文件系统的codepage就会这样,用ASCII好像是默认全大写的,如果设置文件系统只使用英文的话,建议使用codepage:  437  - U.S. (OEM)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 11:06:56 | 显示全部楼层
雍蕴美 发表于 2014-5-24 10:39
如果你替换了文件系统的codepage就会这样,用ASCII好像是默认全大写的,如果设置文件系统只使用英文的话,建 ...

支持中文,用了936,另外请教一下打开文件可以直接使用短文件名就可以了吧。。tks.
回复 支持 反对

使用道具 举报

发表于 2014-5-24 11:13:14 | 显示全部楼层
冷月_清秋 发表于 2014-5-24 11:06
支持中文,用了936,另外请教一下打开文件可以直接使用短文件名就可以了吧。。tks.

短文件名的确也存在默认大写的问题,打开文件可以直接使用短文件名
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 11:50:05 | 显示全部楼层
雍蕴美 发表于 2014-5-24 11:13
短文件名的确也存在默认大写的问题,打开文件可以直接使用短文件名

再请教一下,长文件名在什么情况下为空,怎么有时有,有时没有。。。

我验证的这个例子里面 当长文件名为空时短文件明是小写,当有长文件名时,短文件名称变成了大写,基本看不到什么规律。。。。
回复 支持 反对

使用道具 举报

发表于 2014-5-24 12:09:43 | 显示全部楼层
冷月_清秋 发表于 2014-5-24 11:50
再请教一下,长文件名在什么情况下为空,怎么有时有,有时没有。。。

我验证的这个例子里面 当长文件名 ...

名字比较短的时候好像是默认只把文件名存储到短文件名的变量里的,需要人工把文件名放到长文件名变量里统一
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 14:36:37 | 显示全部楼层
晋海女 发表于 2014-5-24 12:09
名字比较短的时候好像是默认只把文件名存储到短文件名的变量里的,需要人工把文件名放到长文件名变量里统 ...

谢谢您的指导。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 15:27:22 | 显示全部楼层
冷月_清秋 发表于 2014-5-24 11:50
再请教一下,长文件名在什么情况下为空,怎么有时有,有时没有。。。

我验证的这个例子里面 当长文件名 ...

还有一个问题比较苦恼,基本上找不到文件浏览完成的出口。。。

因为很多时候(f_readdir(&dirs, &finfo) == FR_OK)  结果为真,但是输出不管长短文件名,都为空,但是后面还有文件没被读出。。

中文字库打开成功

英文字库打开成功
长文件名:
短文件名 :.

长文件名:
短文件名 :
..
长文件名:新建文件夹
短文件名 :新建文~1

长文件名:新建文件夹 (2)
短文件名 :新建文~2

长文件名:
短文件名 :testtt.bmp

前面两个读出的结果都为空。。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 04:44 , Processed in 0.043015 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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