Программа для поиска самого нового файла среди неизвестного количества файлов

Мне нужно написать программу для MCU STM32 с C и FATFS, чтобы найти самый новый файл среди неизвестного количества файлов. Имена файлов содержат даты их создания, числа в имени файла разделяются знаком _. например: oil_sensor_22_07_20_13_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 newest_log_file[128];
  char oldest_log_file[128];


  char first_log_file [128];
  char second_log_file [128];

  char first_log_file_cpy [128];
  char second_log_file_cpy [128];


  //char printf_buff [128];

  // find first file
  fr = f_findfirst(&dj, &fno1, "", "oil_sensor_*.csv");

  strcpy( first_log_file,fno1.fname);

  strcpy(first_log_file_cpy, first_log_file);

  if (!fno1.fname[0]) {
      bool make_first_log_file = true;
  }

  if (fno1.fname[0]) {
      fr = f_findnext(&dj, &fno1);
  }

  if (fno1.fname[0]) {
      strcpy(second_log_file,fno1.fname);

      strcpy(second_log_file_cpy, second_log_file);
  }


  printf("\r\nFirst Log File: %s\r\n", first_log_file);

  printf("\r\nSecond Log File: %s\r\n", second_log_file);


  double seconds = calc_passed_secs(first_log_file , second_log_file);

  if (seconds < 0){
    strcpy(newest_log_file, second_log_file_cpy);
  }

  if (seconds > 0) {
    strcpy(newest_log_file, first_log_file_cpy);
  }

  printf("\r\nnewest file: %s\r\n", newest_log_file);

  do {

      f_findnext(&dj,&fno1);

      strcpy(first_log_file, fno1.fname);

      strcpy(first_log_file_cpy, first_log_file);

      f_findnext(&dj,&fno1);

      strcpy(second_log_file,fno1.fname);

      strcpy(second_log_file_cpy, second_log_file);

      printf("\r\nFirst Log File: %s\r\n", first_log_file);

      printf("\r\nSecond Log File: %s\r\n", second_log_file);

      if (seconds < 0){
        strcpy(newest_log_file, second_log_file_cpy);
      }

      if (seconds > 0) {
        strcpy(newest_log_file, first_log_file_cpy);
      }

      printf("\r\nnewest file: %s\r\n", newest_log_file);


      seconds = calc_passed_secs(first_log_file, second_log_file);

} while (fr == FR_OK && fno1.fname[0]);

  f_closedir(&dj);

person vouria    schedule 23.07.2020    source источник


Ответы (1)


Алгоритм довольно прост, псевдокод ниже:

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

Все, что он делает, это то, что он сохраняет первый файл в списке файлов до того, как произойдет цикл, затем вы просматриваете все файлы и сравниваете их дату с сохраненной. Если он новее, чем вы меняете сохраненный файл на тот, который вы только что проверили, продолжайте цикл. Как только вы закончите цикл, ссылка будет указывать на самый новый файл в списке.

person Jacek Ślimok    schedule 23.07.2020
comment
Здравствуйте, спасибо за ваш ответ. Проблема в том, что поскольку я не знаю, сколько файлов на SD-карте, я не знаю, как написать цикл for. Но я попробую еще раз, а также с вашим решением. - person vouria; 23.07.2020
comment
См. f_readdir, который позволяет просмотреть содержимое каталога: elm-chan.org/ fsw/ff/doc/readdir.html - person Jacek Ślimok; 23.07.2020
comment
Спасибо, Яцек, обязательно попробую - person vouria; 23.07.2020