硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3084|回复: 6
收起左侧

[FatFs] 请教一个FATFS长文件名的问题。

[复制链接]

13

主题

45

回帖

84

积分

初级会员

积分
84
发表于 2019-10-25 17:49:41 | 显示全部楼层 |阅读模式
RT,我在FATFS中开启了长文件名支持,并且是使用了操作系统的。
  1. #define _USE_LFN     3    /* 0 to 3 */
  2. #define _MAX_LFN     255    /* Maximum LFN length to handle (12 to 255) */
复制代码



在FreeRTOS中的Task中调用以下函数:
  1.    f_opendir(&dj,"0:VendingMachines/advertisement");
  2.     f_readdir(&dj,&fno);          
复制代码

发现个问题,fno中的fname中找不到长文件名的文件“ad11111111111.bmp”,短文件名的找到了,名字在fname中。
正常来说启用了长文件名不应该在flname中的吗?

秋解惑
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-10-25 17:52:20 | 显示全部楼层
你当前用的那个版本,新版和低版本不同
回复

使用道具 举报

13

主题

45

回帖

84

积分

初级会员

积分
84
 楼主| 发表于 2019-10-25 18:04:09 | 显示全部楼层
eric2013 发表于 2019-10-25 17:52
你当前用的那个版本,新版和低版本不同

硬汉哥,意思是,我FLASH中的版本跟MCU中移植的版本,不一样?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-10-25 18:09:52 | 显示全部楼层
a3748622 发表于 2019-10-25 18:04
硬汉哥,意思是,我FLASH中的版本跟MCU中移植的版本,不一样?

不是,我的意思是你当前用的fatfs版本是那个,早期的版本和新版长文件名显示略有不同
回复

使用道具 举报

13

主题

45

回帖

84

积分

初级会员

积分
84
 楼主| 发表于 2019-10-26 09:57:34 | 显示全部楼层
eric2013 发表于 2019-10-25 18:09
不是,我的意思是你当前用的fatfs版本是那个,早期的版本和新版长文件名显示略有不同

直接stm32cubemx生成的,0.11版本。我打开fno这个结构体看了,使能了长字符串的时候fname变成lsname
但是这个lsname里面是空的,只有fname里面有东西。

硬汉哥,你说我要不要自己手动移植一个新版本的fatfs?毕竟我格式化的时候是用电脑格式化的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-10-26 14:35:16 | 显示全部楼层
a3748622 发表于 2019-10-26 09:57
直接stm32cubemx生成的,0.11版本。我打开fno这个结构体看了,使能了长字符串的时候fname变成lsname
但 ...

新版要这么获取

static void ViewRootDir(void)
{
        FRESULT result;
        uint32_t cnt = 0;
        FILINFO fno;
       
       
        /* 挂载文件系统 */
        result = f_mount(&fs, DiskPath, 0);        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("挂载文件系统失败 (%s)\r\n", FR_Table[result]);
        }

        /* 打开根文件夹 */
        result = f_opendir(&DirInf, DiskPath); /* 如果不带参数,则从当前目录开始 */
        if (result != FR_OK)
        {
                printf("打开根目录失败  (%s)\r\n", FR_Table[result]);
                return;
        }

        printf("属性        |  文件大小 | 短文件名 | 长文件名\r\n");
        for (cnt = 0; ;cnt++)
        {
                result = f_readdir(&DirInf, &FileInf);                 /* 读取目录项,索引会自动下移 */
                if (result != FR_OK || FileInf.fname[0] == 0)
                {
                        break;
                }

                if (FileInf.fname[0] == '.')
                {
                        continue;
                }

                /* 判断是文件还是子目录 */
                if (FileInf.fattrib & AM_DIR)
                {
                        printf("(0x%02d)目录  ", FileInf.fattrib);
                }
                else
                {
                        printf("(0x%02d)文件  ", FileInf.fattrib);
                }

                f_stat(FileInf.fname, &fno);

                /* 打印文件大小, 最大4G */
                printf(" %10d", (int)fno.fsize);

                printf("  %s\r\n", (char *)FileInf.fname);        /* 长文件名 */
        }

        /* 卸载文件系统 */
         f_mount(NULL, DiskPath, 0);
}

回复

使用道具 举报

13

主题

45

回帖

84

积分

初级会员

积分
84
 楼主| 发表于 2019-11-7 08:53:14 | 显示全部楼层
eric2013 发表于 2019-10-26 14:35
新版要这么获取

static void ViewRootDir(void)

谢谢硬汉哥,我现在是用
  1. f_findfirst(&dj, &fno, "0:VendingMachines/advertisement", "*.bin");  

  2. res = f_findnext(&dj, &fno);   
复制代码
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 00:16 , Processed in 0.168339 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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