前言:
在前面的调试记录中记录并解决了filex在读取FAT和exFAT格式U盘中含中文名称文件时,如何获取到完整的名称。这份文档将介绍使用filex在FAT和exFAT格式中创建含中文名称的文件的相关问题及解决方法的调试记录。
FAT格式:
和读取FAT格式的U盘中的含中文名称的文件一样,想要创建含中文名称的文件,需要使用带unicode的API,此处需要使用的创建文件API是:fx_unicode_file_create
底层创建过程:
使用fx_unicode_file_createAPI需要输入媒体指针,Unicode名字指针,名字长度和存放返回的短名称指针。实际使用会发现返回的短名称是固定的‘Z’开头加一串数字,文件名的后缀不保留,分析源码可以看到文件的创建过程如下: 1) 根据输入的unicode名称的长度创建一个‘Z’开头的临时长文件名,并且按照此长文件名去调用fx_file_createAPI去创建一个文件: 2) 接着再使用fx_unicode_directory_entry_changeAPI来将文件名称修改为输入的Unicode名称; 3) 最后将使用长文件名创建的文件的短文件名赋值给输入的短文件名数组:
问题分析及解决方案:
按上述创建的文件重新读入时,会发现得到的短文件名称没有后缀,如果在此时使用后缀来判断文件是否符合要求将不合适。 针对这个问题有两个方案可以解决: 1) 在读出文件短文件名后再读取一次其Unicode名称,按照读取到的Unicode名称作为判断依据; 2) 修改创建时临时长文件名的命名处理部分的代码,在创建文件时就将文件后缀包含其中,得到的短文件名也能包含后缀名。 两个方案中方案一会比较繁琐,即使没有Unicode名称的文件也要读取一遍,但好在无需修改filex库文件;而方案二可以减少后续的一些判断操作,只是需要修改filex库文件。目前方案二已经修改并初步验证,后续具体使用哪一种方案待测试情况而定。
exFAT格式:
问题分析:
exFAT格式的文件创建没有专门的Unicode名称的API可使用,只能调用fx_file_createAPI来创建文件。但是此API不能直接输入Unicode名称,并且和读取Unicode文件名称一样,filex底层默认就取消了exFAT格式的Unicode名称的写入,可以看到fx_file_createAPI中写入文件信息时调用的写入函数: 进入写入函数中可以看到进一步调用了_fx_directory_exFAT_unicode_entry_write函数,函数的入口形参最后两个是文件Unicode名称指针和名称长度,这两个形参都赋值为空: 如此分析下来,想要创建中文名称的文件,和读取时一样,必须要修改filex库文件了!!
解决方案:
解决方案初步的想法是和FAT格式fx_unicode_file_createAPI的思路一样,创建完毕后再修改名称。 一开始调试是在创建后写入文件信息时将Unicode名称信息填入: 但是一般来说我们的应用场景中都是创建后马上要写入数据的,于是调整为:先按输入的非unicode名称的文件名创建文件,打开文件操作完成后再进行文件重命名: 上面已经分析到是必须要修改库函数的了,上图中的_fx_file_rename_cc函数就是修改过的,主要修改点是修改名字写入时将Unicode名称和长度一并写入,并且注释掉了对于原本新文件名的处理部分: 注:如果不注释原本对于新文件名的处理代码,将会创建两个文件:一个新文件名称的文件和一个Unicode名称的文件。
总结:
阅读、分析、调试底层函数对于底层逻辑的掌握与熟悉是很有帮助的! 这段时间调试下来发现filex对于Unicode的支持不是很好,主要体现在exFAT格式,底层读写涉及Unicode名称的输入都直接写了空,应该做一个宏开关的,及时默认关闭也行。 当然,我也怀疑是自己把事情搞复杂了,大家有更简单方法欢迎指导!!!
|