Fatfs fno.fname 的字符串比较

Fatfs string comparison for fno.fname

我在读取 SD 卡上的文件大小时遇到​​问题。这些文件的大小在应用程序中会有所不同,因此我需要获取文件的大小。如果我 运行 下面的代码,我可以看到目录中的文件及其大小。

我需要做的是将 DATA.CSV 文件的大小存储为一个变量。 当列表为 "data.csv

时,如何添加比较以获得 fno.fsize

打印出来:

00>  Listing directory: /00>         0  EVENTLOG.CSV   <DIR>   SYSTEM~1   183600  DATA.CSV ```
void Get_data_csv_file_size()//of the data csv
{
   if(Logging_UART_SD_CARD == true){NRF_LOG_INFO("\r\n Listing directory: /");}
    ff_result = f_opendir(&dir, "/");
    if (ff_result)
    {
        if(Logging_UART_SD_CARD == true){NRF_LOG_INFO("Directory listing failed!");}
    }
    do
    {
        ff_result = f_readdir(&dir, &fno);
        if (ff_result != FR_OK)
        {
            if(Logging_UART_SD_CARD == true){NRF_LOG_INFO("Directory read failed.");}
        }
        if (fno.fname[0])
        {
            if (fno.fattrib & AM_DIR)
            {
                if(Logging_UART_SD_CARD == true){NRF_LOG_RAW_INFO("   <DIR>   %s",(uint32_t)fno.fname);}
            }
            else
            {
                if(Logging_UART_SD_CARD == true){NRF_LOG_RAW_INFO("%9lu  %s", fno.fsize, (uint32_t)fno.fname);}

                if(strcmp((uint32_t)fno.fname, "data.csv")==0)//Convert both to a uint32_t
                {
                    Size_of_file = fno.fsize;//Set the size of the file
                    //Does not get to here
                }
            }
        }
    }
    while (fno.fname[0]);
}


请注意,这是使用 arm board 在 C 中编程的。我需要做什么操作才能得到文件大小?

我想要这样的东西:

   if(fno.name == "data.csv")
   {
       Size_of_file = fno.fsize;//Set the size of the file
   }

找到一个使用 snprintf 的解决方案,需要将 fno.fname 转换为字符串以比较结果。

char string_test[9] = "DATA.CSV";
char name_test[9]={0};
snprintf(name_test, sizeof(name_test),"%s",(uint32_t)fno.fname);
NRF_LOG_INFO("Result is: %s",name_test); 
int result = strcmp(name_test, string_test);
if(result==0)//Convert both to a uint32_t
{
    Size_of_file = fno.fsize;//Set the size of the file
    NRF_LOG_INFO("Size of file using is: %9lu",Size_of_file);
}

以防万一您确定使用 stricmp() 的实现会有用,这里是我使用过的一个:

//case insensitive string compare
int cb_stricmp(const char *a, const char *b) 
{
     if(!a) return -1;
     if(!b) return -1;
     int ch_a = 0; 
     int ch_b = 0;

     while ( ch_a != '[=10=]' &&ch_a == ch_b)
     {
         ch_a = (unsigned char) *a++;
         ch_b = (unsigned char) *b++;
         ch_a = tolower(toupper(ch_a));
         ch_b = tolower(toupper(ch_b));         
     }
    return ch_a - ch_b;
}