Stm32 在未知数量的文件中查找最新文件的程序

Stm32 在未知数量的文件中查找最新文件的程序,stm32,fatfs,Stm32,Fatfs,我需要用C和FATF为STM32 MCU编写一个程序,以便在未知数量的文件中找到最新的文件。文件名包含它们的创建日期,文件名中的数字用“\”分隔。例如:机油传感器\u 22\u 07\u 20\u 13\u 15.csv 我已经编写了一个代码来从文件中提取日期和时间,并计算它们的时差。但我不知道如何在所有文件中找到最新的文件 我包括计算两个文件之间时间差的代码和在两个文件中查找最新文件的代码 用于计算两个文件名之间的时间差的函数: double calc_passed_secs(char * n

我需要用C和FATF为STM32 MCU编写一个程序,以便在未知数量的文件中找到最新的文件。文件名包含它们的创建日期,文件名中的数字用“\”分隔。例如:机油传感器\u 22\u 07\u 20\u 13\u 15.csv

我已经编写了一个代码来从文件中提取日期和时间,并计算它们的时差。但我不知道如何在所有文件中找到最新的文件

我包括计算两个文件之间时间差的代码和在两个文件中查找最新文件的代码

用于计算两个文件名之间的时间差的函数:

double calc_passed_secs(char * name_str_01, char * name_str_02 ){

struct tm tm_struct_1,tm_struct_2;
time_t time_t_1,time_t_2;


// Returns first token
char* token = strtok(name_str_01, "_");

token = strtok(NULL, "_");

token = strtok(NULL, "_");
tm_struct_1.tm_mday = atoi(token);

token = strtok(NULL, "_");
tm_struct_1.tm_mon = atoi(token);

token = strtok(NULL, "_");
tm_struct_1.tm_year = atoi(token);

token = strtok(NULL, "_");
tm_struct_1.tm_hour = atoi(token);

token = strtok(NULL, "_");
token = strtok(token, ".");
tm_struct_1.tm_min = atoi(token);

tm_struct_1.tm_sec = 0;

// Returns first token
token = strtok(name_str_02, "_");

token = strtok(NULL, "_");

token = strtok(NULL, "_");
tm_struct_2.tm_mday = atoi(token);

token = strtok(NULL, "_");
tm_struct_2.tm_mon = atoi(token);

token = strtok(NULL, "_");
tm_struct_2.tm_year = atoi(token);

token = strtok(NULL, "_");
tm_struct_2.tm_hour = atoi(token);

token = strtok(NULL, "_");
token = strtok(token, ".");
tm_struct_2.tm_min = atoi(token);

tm_struct_2.tm_sec = 0;

double seconds = difftime(mktime(&tm_struct_1),mktime(&tm_struct_2));

printf("\r\nTime difference in seconds: %.f\r\n",seconds);

return seconds;

}
以及查找最新文件的程序(该程序未给出所需的结果)

char最新日志文件[128];
char最早的日志文件[128];
char first_log_文件[128];
第二个字符日志文件[128];
char first_log_file_cpy[128];
char second_log_file_cpy[128];
//char printf_buff[128];
//查找第一个文件
fr=f_findfirst(&dj,&fno1,“,”机油传感器*.csv“);
strcpy(第一个日志文件,fno1.fname);
strcpy(第一个日志文件、第一个日志文件);
如果(!fno1.fname[0]){
bool make_first_log_file=true;
}
if(fno1.fname[0]){
fr=f_findnext(&dj,&fno1);
}
if(fno1.fname[0]){
strcpy(第二个日志文件,fno1.fname);
strcpy(第二个日志文件、第二个日志文件);
}
printf(“\r\n第一个日志文件:%s\r\n”,第一个日志文件);
printf(“\r\n第二个日志文件:%s\r\n”,第二个日志文件);
双秒=计算通过秒(第一个日志文件,第二个日志文件);
如果(秒<0){
strcpy(最新的日志文件,第二个日志文件);
}
如果(秒>0){
strcpy(最新的日志文件,第一个日志文件);
}
printf(“\r\n最新文件:%s\r\n”,最新的日志文件);
做{
f_findnext(&dj,&fno1);
strcpy(第一个日志文件,fno1.fname);
strcpy(第一个日志文件、第一个日志文件);
f_findnext(&dj,&fno1);
strcpy(第二个日志文件,fno1.fname);
strcpy(第二个日志文件、第二个日志文件);
printf(“\r\n第一个日志文件:%s\r\n”,第一个日志文件);
printf(“\r\n第二个日志文件:%s\r\n”,第二个日志文件);
如果(秒<0){
strcpy(最新的日志文件,第二个日志文件);
}
如果(秒>0){
strcpy(最新的日志文件,第一个日志文件);
}
printf(“\r\n最新文件:%s\r\n”,最新的日志文件);
秒=计算通过秒(第一个日志文件,第二个日志文件);
}而(fr==fr_OK&&fno1.fname[0]);
f_closedir(&dj);

算法非常简单,伪代码如下:

newest_file = first_file
for file in file_list:
  if file.date > newest_file.date:
    newest_file = file

它所做的只是在循环发生之前将第一个文件存储在文件列表中,然后检查所有文件并将它们的日期和存储的日期进行比较。如果更新,则将存储的文件更改为刚检查的文件,然后继续循环。循环完成后,引用将指向列表中最新的文件。

您好,谢谢您的回答。问题是,因为我不知道SD卡上有多少文件,所以我不知道如何编写for循环。但是我会再试一次,还有您的解决方案。请参阅允许您列出目录内容的
f_readdir
:谢谢,Jacek,我一定会再试一次
newest_file = first_file
for file in file_list:
  if file.date > newest_file.date:
    newest_file = file