a3748622 发表于 2019-10-25 17:49:41

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

RT,我在FATFS中开启了长文件名支持,并且是使用了操作系统的。
#define _USE_LFN   3    /* 0 to 3 */
#define _MAX_LFN   255    /* Maximum LFN length to handle (12 to 255) */


在FreeRTOS中的Task中调用以下函数:
   f_opendir(&dj,"0:VendingMachines/advertisement");
    f_readdir(&dj,&fno);        
发现个问题,fno中的fname中找不到长文件名的文件“ad11111111111.bmp”,短文件名的找到了,名字在fname中。
正常来说启用了长文件名不应该在flname中的吗?

秋解惑

eric2013 发表于 2019-10-25 17:52:20

你当前用的那个版本,新版和低版本不同

a3748622 发表于 2019-10-25 18:04:09

eric2013 发表于 2019-10-25 17:52
你当前用的那个版本,新版和低版本不同

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

eric2013 发表于 2019-10-25 18:09:52

a3748622 发表于 2019-10-25 18:04
硬汉哥,意思是,我FLASH中的版本跟MCU中移植的版本,不一样?

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

a3748622 发表于 2019-10-26 09:57:34

eric2013 发表于 2019-10-25 18:09
不是,我的意思是你当前用的fatfs版本是那个,早期的版本和新版长文件名显示略有不同

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

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

eric2013 发表于 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 = f_opendir(&DirInf, DiskPath); /* 如果不带参数,则从当前目录开始 */
        if (result != FR_OK)
        {
                printf("打开根目录失败(%s)\r\n", FR_Table);
                return;
        }

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

                if (FileInf.fname == '.')
                {
                        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);
}

a3748622 发表于 2019-11-7 08:53:14

eric2013 发表于 2019-10-26 14:35
新版要这么获取

static void ViewRootDir(void)


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

res = f_findnext(&dj, &fno);   
页: [1]
查看完整版本: 请教一个FATFS长文件名的问题。