ThreadX下使用的FileX,版本为6.4.0,使用STM32H563,SDK版本:STM32Cube FW_H5 V1.6.0
使用fx_directory_next_entry_find(&sdio_disk , file_name)遍历文件夹下的条目,我使用16GB FAT32的SD卡可以获取到中文文件名的短名(UTF-16LE编码),使用fx_unicode_name_get(&sdio_disk,file_name,unicode_name,&unicode_name_length)可以获取到长文件名(UTF-16LE编码)。但当我使用400GB的exFAT的SD卡时fx_directory_next_entry_find获取到的中文文件名异常,fx_unicode_name_get获取不到长文件名;UTF-16LE编码的文件名{0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x66,0x00,0x6c,0x00,0x61,0x00,0x63,0x00}使用fx_directory_next_entry_find获取到的文件名为{0xF7,0xFE,0xB1,0x00}
使用的函数内容
/* 搜索音频文件 */
uint32_t music_file_search(char* file_directory, char *file_list)
{
CHAR file_name[FX_MAX_LONG_NAME_LEN];
UCHAR unicode_name[FX_MAX_LONG_NAME_LEN]; // 原始UTF-16
ULONG unicode_name_length;
CHAR long_name[50];
uint16_t file_count = 0;
uint8_t status;
status = fx_directory_default_set(&sdio_disk,file_directory);
// status = fx_directory_local_path_set(&sdio_disk, file_directory, file_directory);
if (status != FX_SUCCESS) {
printf("fx_directory_default_set fail:0x%x\r\n", status);
return 0;
}
while (1) {
printf("-------------------------------------------------------------\r\n");
status = fx_directory_next_entry_find(&sdio_disk , file_name);
if (status == FX_NO_MORE_ENTRIES){//文件夹遍历完毕退出
// printf("Found %d files and saved them to the list.\r\n", file_count);
printf("folder traversal completed,found %d files.\r\n", file_count);
break;
}
if (status != FX_SUCCESS) {
printf("fx_directory_next_entry fail:0x%x\r\n", status);
break;
}
//检查条目是不是目录 是目录就跳过下面内容开始新循环
status = fx_directory_name_test(&sdio_disk, file_name);
if (status == FX_SUCCESS) continue;
status = fx_directory_long_name_get(&sdio_disk,file_name,long_name);
// status = fx_directory_long_name_get(&sdio_disk, file_name, unicode_name);
if (status == FX_SUCCESS)
{
printf("fx_directory_long_name_get success.\r\n");
for (uint8_t i=0; i<20; i++) {
printf("0x%x,",long_name[i]);
long_name[i] = 0;
}
printf("\r\n");
}
else {
printf("fx_directory_long_name_get fail:0x%x\r\n", status);
}
// status = fx_unicode_short_name_get()
status = fx_unicode_name_get(&sdio_disk,file_name,unicode_name,&unicode_name_length);
if (status == FX_SUCCESS)
{
printf("unicode_name:%s, len:%ld\r\n",unicode_name,unicode_name_length);
for (uint16_t i=0; i<unicode_name_length*2; i++) {
// if((unicode_name[i] == 0) && (unicode_name[i+1] == 0)) break;
printf("0x%.2x,",unicode_name[i]);
unicode_name[i] = 0;
}
printf("\r\n");
}
else{
printf("fx_unicode_name_get fail:0x%x\r\n", status);
}
printf("file name:%s\r\n", file_name);
for (uint16_t t=0; t<14; t++) {
printf("0x%.2x,",file_name[t]);
file_name[t] = 0;
}
printf("\r\n");
file_count++;
}
status = fx_directory_default_set(&sdio_disk,file_directory);
if (status != FX_SUCCESS) {
printf("fx_directory_local_path_clear fail:0x%x\r\n", status);
}
return file_count;
}
16GB SD卡 FAT32 串口打印的信息
App_ThreadX_ start.
tx_event_flags_create success.
fx_media_open success.
-------------------------------------------------------------
-------------------------------------------------------------
fx_unicode_name_get fail:0x4
file name:test.txt
-------------------------------------------------------------
-------------------------------------------------------------
unicode_name:������, len:9
0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x66,0x00,0x6c,0x00,0x61,0x00,0x63,0x00,
file name:������~1.FLA
-------------------------------------------------------------
unicode_name:������, len:8
0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x74,0x00,0x78,0x00,0x74,0x00,
file name:��������.TXT
-------------------------------------------------------------
unicode_name:1, len:12
0x31,0x00,0x31,0x00,0x32,0x00,0x2d,0x00,0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x74,0x00,0x78,0x00,0x74,0x00,
file name:112-��~1.TXT
-------------------------------------------------------------
fx_unicode_name_get fail:0x4
file name:ABCD1234567890.txt
-------------------------------------------------------------
folder traversal completed,found 5 files.
400GB SD卡 exFAT 串口打印的信息
App_ThreadX_ start.
tx_event_flags_create success.
fx_media_open success.
-------------------------------------------------------------
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:���
-------------------------------------------------------------
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:ABCD1234567890.txt
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:test.txt
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:112-���
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:���
-------------------------------------------------------------
folder traversal completed,found 5 files.