请教一个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
你当前用的那个版本,新版和低版本不同
硬汉哥,意思是,我FLASH中的版本跟MCU中移植的版本,不一样? a3748622 发表于 2019-10-25 18:04
硬汉哥,意思是,我FLASH中的版本跟MCU中移植的版本,不一样?
不是,我的意思是你当前用的fatfs版本是那个,早期的版本和新版长文件名显示略有不同 eric2013 发表于 2019-10-25 18:09
不是,我的意思是你当前用的fatfs版本是那个,早期的版本和新版长文件名显示略有不同
直接stm32cubemx生成的,0.11版本。我打开fno这个结构体看了,使能了长字符串的时候fname变成lsname
但是这个lsname里面是空的,只有fname里面有东西。
硬汉哥,你说我要不要自己手动移植一个新版本的fatfs?毕竟我格式化的时候是用电脑格式化的 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);
}
eric2013 发表于 2019-10-26 14:35
新版要这么获取
static void ViewRootDir(void)
谢谢硬汉哥,我现在是用
f_findfirst(&dj, &fno, "0:VendingMachines/advertisement", "*.bin");
res = f_findnext(&dj, &fno);
页:
[1]