硬汉嵌入式论坛

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

[FileX] filex对中文名称文件的完整名字获取-exFAT格式

[复制链接]

14

主题

50

回帖

97

积分

初级会员

积分
97
发表于 2022-9-23 15:25:35 | 显示全部楼层 |阅读模式
问题描述:
            在前面filex读取中文名称的文件名字不全问题的调试记录文档中介绍的解决方法实际测试下来只是对于FAT格式的设备可以使用,对于exFAT格式的设备依旧存在此问题,但是现象不一样,读取到的名字实际分析中文部分只取了其Unicode码的低8bit。
前面介绍的FAT格式获取中文名称的链接如下,大家可以对比阅读:filex对中文名称文件的完整名字获取-https://www.armbbs.cn/forum.php? ... 8&fromuid=31310  (出处: 硬汉嵌入式论坛)


1.jpg

2.jpg


分析过程:
现象分析:
         从现象分析exFAT格式的文件名字是可以正常获取到其Unicode码的,但是因为读取时只读取了低8bit数据,导致中文部分名称异常。

仿真分析:
         排查这种问题,仿真是必不可少的!!!
1)_fx_directory_entry_read_ex
查找文件最终会进入文件读取函数中,对于exFAT和FAT格式的文件将使用不同读取函数:

3.jpg

2)_fx_directory_exFAT_entry_read
分析exFAT格式文件读取函数,其输入形参中倒数第二个是存放Unicode name的指针,在函数中将判断此指针不为空时将文件名字的Unicode码放在指针起始地址处:

4.jpg

5.jpg


但是可以看到_fx_directory_exFAT_entry_read函数的倒数第二个形参是直接赋值为空的,所以没有读取Unicode名字:

6.jpg


验证处理:
         为了验证上述猜想,修改filex底层_fx_directory_entry_read_ex函数,将exFAT格式的文件读取函数,将_fx_directory_exFAT_entry_read函数的倒数第二个形参赋一个实际的值:

7.jpg

注意:修改filex底层后一定要重新编译filex工程,生成最新的库文件,然后再到实际应用工程中重新编译!!


按上述修改后,仿真查看效果:

image.png


可以看到实际测试效果和分析是一致的,那么就需要在实际应用时定义一个全局Unicode数组,用来存放exFAT格式的文件名称即可。


总结:
         此方法可以解决所述问题,但个人认为修改库文件不是上策,只是找不到不修改的办法时,为了满足需求也只能不得已而为之。另外在更新库文件时需要注意及时更改修改过的地方!


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2022-9-23 15:36:08 | 显示全部楼层
这里有个问题,就是中文长文件名访问是否正常,进行文件创建,读写操作。
回复

使用道具 举报

14

主题

50

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2022-9-23 15:39:53 | 显示全部楼层
eric2013 发表于 2022-9-23 15:36
这里有个问题,就是中文长文件名访问是否正常,进行文件创建,读写操作。

我验证看看
回复

使用道具 举报

14

主题

50

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2022-9-28 16:50:13 | 显示全部楼层
eric2013 发表于 2022-9-23 15:36
这里有个问题,就是中文长文件名访问是否正常,进行文件创建,读写操作。

前言:

            在前面的调试记录中记录并解决了filex在读取FAT和exFAT格式U盘中含中文名称文件时,如何获取到完整的名称。这份文档将介绍使用filex在FAT和exFAT格式中创建含中文名称的文件的相关问题及解决方法的调试记录。

FAT格式:

         和读取FAT格式的U盘中的含中文名称的文件一样,想要创建含中文名称的文件,需要使用带unicodeAPI,此处需要使用的创建文件API是:fx_unicode_file_create

底层创建过程:

         使用fx_unicode_file_createAPI需要输入媒体指针,Unicode名字指针,名字长度和存放返回的短名称指针。实际使用会发现返回的短名称是固定的‘Z’开头加一串数字,文件名的后缀不保留,分析源码可以看到文件的创建过程如下:
        1)  根据输入的unicode名称的长度创建一个‘Z’开头的临时长文件名,并且按照此长文件名去调用fx_file_createAPI去创建一个文件:
    1.jpg
                              
        2)  接着再使用fx_unicode_directory_entry_changeAPI来将文件名称修改为输入的Unicode名称;
        3)  最后将使用长文件名创建的文件的短文件名赋值给输入的短文件名数组:
    2.jpg

问题分析及解决方案:

         按上述创建的文件重新读入时,会发现得到的短文件名称没有后缀,如果在此时使用后缀来判断文件是否符合要求将不合适。
         针对这个问题有两个方案可以解决:
1)  在读出文件短文件名后再读取一次其Unicode名称,按照读取到的Unicode名称作为判断依据;
2)  修改创建时临时长文件名的命名处理部分的代码,在创建文件时就将文件后缀包含其中,得到的短文件名也能包含后缀名。
两个方案中方案一会比较繁琐,即使没有Unicode名称的文件也要读取一遍,但好在无需修改filex库文件;而方案二可以减少后续的一些判断操作,只是需要修改filex库文件。目前方案二已经修改并初步验证,后续具体使用哪一种方案待测试情况而定。

exFAT格式:
问题分析:

         exFAT格式的文件创建没有专门的Unicode名称的API可使用,只能调用fx_file_createAPI来创建文件。但是此API不能直接输入Unicode名称,并且和读取Unicode文件名称一样,filex底层默认就取消了exFAT格式的Unicode名称的写入,可以看到fx_file_createAPI中写入文件信息时调用的写入函数:
    3.jpg
   进入写入函数中可以看到进一步调用了_fx_directory_exFAT_unicode_entry_write函数,函数的入口形参最后两个是文件Unicode名称指针和名称长度,这两个形参都赋值为空
    4.jpg
            5.jpg
   如此分析下来,想要创建中文名称的文件,和读取时一样,必须要修改filex库文件了!!

解决方案:

         解决方案初步的想法是和FAT格式fx_unicode_file_createAPI的思路一样,创建完毕后再修改名称。
         一开始调试是在创建后写入文件信息时将Unicode名称信息填入:
    6.jpg
如此是可以成功创建007@疯狂的小饼干.JED文件的,但是创建后不能立即打开!重新搜索文件时可以打开。
         但是一般来说我们的应用场景中都是创建后马上要写入数据的,于是调整为:先按输入的非unicode名称的文件名创建文件,打开文件操作完成后再进行文件重命名:
    7.jpg
   上面已经分析到是必须要修改库函数的了,上图中的_fx_file_rename_cc函数就是修改过的,主要修改点是修改名字写入时将Unicode名称和长度一并写入,并且注释掉了对于原本新文件名的处理部分:
    8.jpg
   注:如果不注释原本对于新文件名的处理代码,将会创建两个文件:一个新文件名称的文件和一个Unicode名称的文件。

总结:

         阅读、分析、调试底层函数对于底层逻辑的掌握与熟悉是很有帮助的!
         这段时间调试下来发现filex对于Unicode的支持不是很好,主要体现在exFAT格式,底层读写涉及Unicode名称的输入都直接写了空,应该做一个宏开关的,及时默认关闭也行
   当然,我也怀疑是自己把事情搞复杂了,大家有更简单方法欢迎指导!!!

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2022-9-28 17:28:16 | 显示全部楼层
疯狂的小饼干 发表于 2022-9-28 16:50
前言:

            在前面的调试记录中记录并解决了filex在读取FAT和exFAT格式U盘中含中文名称文件时 ...

其实有个骚操作,直接把FatFS的cc936码表添加到filex上是不是方便点,直接手动做个互转
回复

使用道具 举报

14

主题

50

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2022-9-29 08:14:20 | 显示全部楼层
eric2013 发表于 2022-9-28 17:28
其实有个骚操作,直接把FatFS的cc936码表添加到filex上是不是方便点,直接手动做个互转

硬汉哥,可以具体说说吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2022-9-29 11:02:48 | 显示全部楼层
疯狂的小饼干 发表于 2022-9-29 08:14
硬汉哥,可以具体说说吗?

filex这个没有做GBK和Unicode的互转码表,应该加上才能完美支持中文。
回复

使用道具 举报

14

主题

50

回帖

97

积分

初级会员

积分
97
 楼主| 发表于 2022-9-30 08:26:54 | 显示全部楼层
eric2013 发表于 2022-9-29 11:02
filex这个没有做GBK和Unicode的互转码表,应该加上才能完美支持中文。

是的。最近项目比较紧张,我过段时间有空了再研究一下吧
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 00:00 , Processed in 0.261011 second(s), 37 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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